所有的数据类型都可以在模板中使用
render(request , 'index.html',context = {' '});
render(request , 'index.html',context = locals());
在模板中使用变量的时候,使用的是字典的key值,key值和value值保持一致
# HTML被直接硬编码在 Python代码之中,Django的 模板系统(Template System)
# 过滤器给我们提供的有六十多个,但是我们只需要掌握10个以内即可
过滤器名称就是函数名# 语法:
{{ obj|filter__name:param }} 变量名字|过滤器名称:变量default:如果一个变量是false或者为空,使用给定的默认值,否则使用变量的值
length:返回值的长度,对字符串和列表都起作用
filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 # '13 KB', '4.1 MB'
date:日期格式
slice:切片
truncatechars:如果字符串字符多于指定的字符数量,那么会被截断,省略号序列(“…”)结尾
safe:告诉Django这段代码是安全的不必转义
# views.py from django.shortcuts import render # Create your views here. def index(request): a = False l = [1,2,3,4,5] size = 43434343434342 import datetime ctime = datetime.datetime.now() value = 'helloworld' from django.utils.safestring import mark_safe # 有很多时候前端的代码也可以在后端处理 s1 = mark_safe('
hello
') return render(request,'index.html',locals())# index.html
Title {{ a|default:'hello' }} {{ l|length }} {{ size| filesizeformat}} {{ ctime| date:"Y-m-d"}} {{ value| slice:'2:-1'}} {{ s1|safe }}# 其它过滤器(了解)
upper 以大写方式输出 add 给value加上一个数值 addslashes 单引号加上转义号 capfirst 第一个字母大写 center 输出指定长度的字符串,把变量居中 cut 删除指定字符串 date 格式化日期 default 如果值不存在,则使用默认值代替 default_if_none 如果值为None, 则使用默认值代替 dictsort 按某字段排序,变量必须是一个dictionary dictsortreversed 按某字段倒序排序,变量必须是dictionary divisibleby 判断是否可以被数字整除 escape 按HTML转义,比如将”<”转换为”<” filesizeformat 增加数字的可读性,转换结果为13KB,89MB,3Bytes等 first 返回列表的第1个元素,变量必须是一个列表 floatformat 转换为指定精度的小数,默认保留1位小数 get_digit 从个位数开始截取指定位置的数字 join 用指定分隔符连接列表 length 返回列表中元素的个数或字符串长度 length_is 检查列表,字符串长度是否符合指定的值 linebreaks 用/或/标签包裹变量 linebreaksbr 用/标签代替换行符 linenumbers 为变量中的每一行加上行号 ljust 输出指定长度的字符串,变量左对齐 lower 字符串变小写 make_list 将字符串转换为列表 pluralize 根据数字确定是否输出英文复数符号 random 返回列表的随机一项 removetags 删除字符串中指定的HTML标记 rjust 输出指定长度的字符串,变量右对齐 slice 切片操作, 返回列表 slugify 在字符串中留下减号和下划线,其它符号删除,空格用减号替换 stringformat 字符串格式化,语法同python time 返回日期的时间部分 timesince 以“到现在为止过了多长时间”显示时间变量 timeuntil 以“从现在开始到时间变量”还有多长时间显示时间变量 title 每个单词首字母大写 truncatewords 将字符串转换为省略表达方式 truncatewords_html 同上,但保留其中的HTML标签 urlencode 将字符串中的特殊字符转换为url兼容表达方式 urlize 将变量字符串中的url由纯文本变为链接 wordcount 返回变量字符串中的单词数
# 标签看起来像是这样的: {% tag %}
# 标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加 载其后的变量将使用到的额外信息到模版中。
# 一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})for标签:
{% for person in person_list %}
{{ person.name }}
{% endfor %} #可以利用{% for obj in list reversed %}反向完成循环。遍历一个字典:
{% for key,val in dic.items %}
{{ key }}:{{ val }}
{% endfor %} {% for foo in d.keys %}{{ foo }}
{% endfor %} {% for foo in d.values %}{{ foo }}
{% endfor %} {% for foo in d.items %}{{ foo }}
{% endfor %}注:循环序号可以通过{{forloop}}显示
forloop.counter 序号
forloop.counter0 索引值
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(T/F)
forloop.last 当前循环是不是最后一次循环(T/F)
forloop.parentloop 本层循环的外层循环for … empty:以便在给出的组是空的或者没有被找到时,可以有所操作。
{% for person in person_list %}
{{ person.name }}
{% empty %}sorry,no person here
{% endfor %}
if标签:
# {% if %}会对一个变量求值,如果它的值是True(存在、不为空、且不是boolean类型的false值)对应的内容块会输出
# if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断
{% if num > 100 or num < 0 %}
无效
{% elif num > 80 and num < 100 %}优秀
{% else %}凑活吧
{% endif %}with标签:起别名
# 使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
d = {'username':'kevin','age':18,'info':'这个人有点意思','hobby':[111,222,333,{'info':'NB'}]} # with起别名 {% with d.hobby.3.info as nb %}
{{ nb }}
在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式{{ d.hobby.3.info }}
{% endwith %} {% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %} 不要写成as# 自定义的标签和过滤器:
1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的 simple_tag.
2、在app中创建templatetags模块(模块名只能是templatetags
3、创建任意 .py 文件,如:my_tags.py
from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 @register.filter def filter_multi(v1,v2): return v1 * v2 @register.simple_tag def simple_tag_multi(v1,v2): return v1 * v2 @register.simple_tag def my_input(id,arg): result = "" %(id,arg,) return mark_safe(result)
# 模块之继承:
{% entends 'home.heml' %} head: {% block css %} {% endblock %}
# 一定要在被继承的页面中划分区域,你需要在哪个地方划分哪一块,可以划分多个区域,
{% block css %} {% endblock %} {% block js %} {% endblock %} {% include 'haha.html' %}
# 导入语法:{% include '模版名称' %} 如:{% include 'adv.html' %}
1、单表查询:
insert update delete all filter
2、常见的查询方法:
单表操作: 1、all() 查询所有数据,索引取值 2、filter() 过滤条件查询 3、get() 查询数据,查询数据为空的情况直接报错 4、last() 取所有数据的最后一条 5、values( id,username,password ) 取值,列表套字典[{'id':1,'username':...},{...}] 6、vallues_list() 取值,列表套元组,都支持for循环 7、pring(res.quert) 查看内部的SQL语句,只有防御的结果是queryset对象的时候才能查看 8、distinct() 去重 9、order_by( 'id' ) 默认情况升序排序;('-id')倒序 10、reverse() 翻转 11、count() 统计当前表中数据的个数 12、exclude(pk=1) 排除在外 13、exists() 看数据到底有没有
3、基于双下划线的查询:
res = models.UserInfo.object.filter(age_gt=38).all() age__gt=1---大于 age__lt=1---小于 age__gte=1---大于等于 age__lte=1---小于等于 ageage__in=[18,40] 年龄在十八或40的,或 age__range=[18,40] 年龄在十八到40的,之间
# 包含s的数据,模糊查询:
包含s的数据,模糊查询: # select * from userinfor where name like '%s%', res = models.UserInfo.object.filter(username__contains='s').all() print(res) print(res.query) username__icontains--忽略大小写 username__startswith=='o'--以o开头的 username__endswith=='o'--以o结尾的
# 日期查询:
register_time = models.DateTimeField(auto_now=True,auto_now_add=True,null=True) auto_now: 修改的时间 auto_now_add: 刚加进去时间 查询时间:查2020年1月份的 filter(register_time__year='2020',register_time__month='01).all()
1 年龄大于35岁的数据
res = models.User.objects.filter(age__gt=35)
2 年龄小于35岁的数据
res = models.User.objects.filter(age__lt=35)
3、大于等于 小于等于
res = models.User.objects.filter(age__gte=32)
res = models.User.objects.filter(age__lte=32)4、年龄是18 或者 32 或者40
res = models.User.objects.filter(age__in=[18,32,40])5、年龄在18到40岁之间的 首尾都要
res = models.User.objects.filter(age__range=[18,40])6、查询出名字里面含有s的数据 模糊查询
res = models.User.objects.filter(name__contains='s')
7、是否区分大小写 查询出名字里面含有p的数据 区分大小写
res = models.User.objects.filter(name__contains='p')
8、忽略大小写
res = models.User.objects.filter(name__icontains='p')res = models.User.objects.filter(name__startswith='j')
res1 = models.User.objects.filter(name__endswith='j')
9、查询出注册时间是 2020 1月
res = models.User.objects.filter(register_time__month='1')
res = models.User.objects.filter(register_time__year='2020')
# 当你只是想测试django中的某一个py文件内容 那么你可以不用书写前后端交互的形式
而是直接写一个测试脚本即可# 脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
# 测试环境的准备 去manage.py中拷贝前四行代码 然后自己写两行import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day64.settings") import django django.setup()
# 在这个代码块的下面就可以测试django里面的单个py文件了
方式1:queryset对象才能够点击query查看内部的sql语句
res = models.User.objects.values_list('name','age') #
print(res.query) 方式2:所有的sql语句都能查看
# uptade等等没有queryset对象的只需设置配置文件setting
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }