模板之标签
就是在模板里面使用流程控制:if、else、elseif、for
标签看起来是这样的:{% tag %}
for标签
{% for person in person_list %} {{ forloop }} <p>{{ person.name }}</p> {% endfor %} {% for person in person_list %} {#判断list是否有值,没有就走empty#} <p>{{ person }}</p> {% empty %} <p>sorry,no person here</p> ''' forloop.counter The current iteration of the loop (1-indexed) 当前循环的索引值(从1开始) forloop.counter0 The current iteration of the loop (0-indexed) 当前循环的索引值(从0开始) forloop.revcounter The number of iterations from the end of the loop (1-indexed) 当前循环的倒序索引值(从1开始) forloop.revcounter0 The number of iterations from the end of the loop (0-indexed) 当前循环的倒序索引值(从0开始) forloop.first True if this is the first time through the loop 当前循环是不是第一次循环(布尔值) forloop.last True if this is the last time through the loop 当前循环是不是最后一次循环(布尔值) forloop.parentloop 本层循环的外层循环 ''' # 遍历字典 {% for key, val in dic.items %} {# 将字典的key和val值分开取出来 #} <p>{{ key }}:{{ val }}</p> {% endfor %} {% for d in dic %} {# 取出字典的key值 #} <p>{{ d }}</p> {% endfor %} {% for k in dic.keys %}{# 取出字典的key值 #} <p>{{ k }}</p> {% endfor %} {% for v in dic.values %}{# 取出字典的value值 #} <p>{{ v }}</p> {% endfor %}
if标签
{% if num > 100 or num < 0 %} <p>无效</p> {% elif num > 80 and num < 100 %} <p>优秀</p> {% else %} <p>凑活吧</p> {% endif %} {#if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。#}
with起别名
d = {'username':'kevin','age':18,'info':'这个人有点意思','hobby':[111,222,333,{'info':'NB'}]} {% with d.hobby.3.info as nb %} <p>{{ nb }}</p> {# 在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式 #} <p>{{ d.hobby.3.info }}</p> {% endwith %}
csrf_token
渲染标签
<form action="" method="post"> {% csrf_token %} {#加上这个就能够让post请求submit提交了,不用注释中间件了#} <input type="submit"> </form>
模板的继承
继承:继承之后的页面和被继承的页面一模一样
继承之后要自己划分要修改的区域
# 一个页面中应该有三块区域被修改 css js html {% extends '要继承的页面' %} {% block js %} {#被继承页面中block包围的部分可以在继承页面中修改,可以划分多个block包围块#} <script> alert(123) </script> {% endblock %} {% block css %} {% endblock %} # 模板的导入 {% include 'hello.html' %}
模型层
测试环境的搭建
#tests.py的用法 # 制作django环境 import os import sys if __name__ == '__main__': os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day58_dj.settings') import django django.setup()
常见的十几种查询方法
filter().first() / filter().last()
# 在models文件中添加,能够返回username,在后续用以区分 def __str__(self): return self.username res = models.UserInfo.objects.filter().all() try: # 防止出现列表为空的情况提前抛出错误 # 返回的是一个列表套字典 print(res) # <QuerySet [<UserInfo: jack>, <UserInfo: tom>, <UserInfo: jerry>, <UserInfo: tank>]> print(res[0]) # jack # res[0] 是一个对象,可以使用点语法 print(res[0].username) # jack print(res[0].password) # 123 except Exception as z: print(z) res = models.UserInfo.objects.filter().first() # 取出第一个值 print(res) # jack # res = res[0] 是一个对象,可以使用点语法 print(res.username) # jack res = models.UserInfo.objects.filter().last() # 取出最后一个值 print(res) # tank
values value_list
res = models.UserInfo.objects.values() # 列表套字典形式将每一组值当成一个字典输出,默认查询所有字段 # <QuerySet [{'id': 1, 'username': 'jack', 'password': '123'}, {'id': 3, 'username': 'tom', 'password': '123'}, {'id': 4, 'username': 'jerry', 'password': '123'}, {'id': 5, 'username': 'tank', 'password': '123'}]> print(res) res1 = models.UserInfo.objects.values('username') # 可以限制查询的字段 # <QuerySet [{'username': 'jack'}, {'username': 'tom'}, {'username': 'jerry'}, {'username': 'tank'}]> print(res1) # 支持循环,一个个字典分开拿出来 for i in res: print(i) res2 = models.UserInfo.objects.values_list() # 列表套元组,元祖只取value值,其他用法和value一样,通过下标索引取对应的值 # <QuerySet [(1, 'jack', '123'), (3, 'tom', '123'), (4, 'jerry', '123'), (5, 'tank', '123')]> print(res2)
查看原生SQL语句
res = models.UserInfo.objects.values_list() print(res) # QuerySet对象,都有一个属性:query # SELECT "app01_userinfo"."id", "app01_userinfo"."username", "app01_userinfo"."password" FROM "app01_userinfo" print(res.query) # 限制:只有QuerySet对象才有query属性 '''第二种方式:在配置文件中设置, 但是必须要print才能显示出来''' LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level': 'DEBUG', }, } }
排序
res = models.UserInfo.objects.order_by('id') # 默认是升序 print(res) res1 = models.UserInfo.objects.order_by('-id') # 降序 print(res1)
反转
res=models.UserInfo.objects.all().order_by('-id').reverse() print(res) # 反转,先排序,数据要先有序才能反转
查看数量
# 查看数量 res = models.UserInfo.objects.count() print(res)
排除
# 排除 res = models.UserInfo.objects.exclude(id=1) print(res)
判断
# exist:判断值是否存在 res = models.UserInfo.objects.filter(pk=2).exists() print(res)
基于双下划线的查询
# 1 年龄大于35岁的数据 res = models.UserInfo.objects.filter(age__gte=35).all() print(res) # 年龄小于10岁的数据 equal res = models.UserInfo.objects.filter(age__lte=10).all() print(res) # 年龄是10 或者 20 或者 30 res = models.UserInfo.objects.filter(age__in=[10, 20, 30]).all() print(res) # 年龄在18到40岁之间的 首尾都要 from table where age between 18 and 40 res = models.UserInfo.objects.filter(age__range=[18, 40]) print(res) # 查询出名字里面含有s的数据 模糊查询 from table where username like '%s%' res = models.UserInfo.objects.filter(username__contains='s').all() print(res) # 用户名以s开头的 res = models.UserInfo.objects.filter(username__startswith='s').all() # like 's%' res = models.UserInfo.objects.filter(username__endswith='s').all() # like '%s' print(res) # 查询出注册时间是 2023 5月 res = models.UserInfo.objects.filter(reg_time__month=5, reg_time__year=2023, reg_time__day=1).all() res = models.UserInfo.objects.filter(reg_time__month=5, reg_time__day=1).all() print(res)
外键字段的查询
# 一对多的查询 # 图书和出版社是一对多的关系 # 增加一本图书? # 外键字段的查询和增加 # 增加一本图书 models.Book.objects.create(title='洋哥自转', price=1000, publish_date='2023-08-01', publish_id=1) publish_obj = models.Publish.objects.filter(pk=20).first() try: publish_obj = models.Publish.objects.get(pk=20) except: pass models.Book.objects.create(title='洋哥自转2', price=2000, publish_date='2023-08-02', publish=publish_obj) print(publish_obj) # None # 删除一本图书 models.Book.objects.filter(pk=1).delete() # 修改 models.Book.objects.filter(pk=2).update(publish=publish_obj) models.Book.objects.filter(pk=2).update(publish_id=3)
标签:Python,res,Django,filter,models,objects,UserInfo,print,day57 From: https://www.cnblogs.com/zfq132/p/17601610.html