Django模板语言
1.基础语法:
return render(request,'qwe.html',{'obj':obj}),render的最后的字典可以以键值对的形式传入多个值,
在django模板中只用到两种符号
变量相关:{{变量名}} 逻辑相关:{% %}
1)变量相关:
a: 变量名有字母数字和下划线组成,(.)用来获取对象的属性值,ls.0 --> ls[0] dic.key --> dic[key]
注意事项:
.只能调用不带参数的方法
当模板系统遇到一个.时,会按照如下的顺序去查询:
1.在字典中查询 2.属性或则方法 3.数字索引
b: Filters:过滤器,用来修改变量的显示结果;
语法:{{value|filter_name:参数}} 管道符'|'前后不能添加空格,参数':'前后也没有,要想加上,必须加上引号
几个常用的过滤器:
- default:如果value值没有传,就会显示默认值nothing
-
{{ value|default:'nothing' }}
- 注:在django项目里settings.py文件里的TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid里设置跟default的作用一样;
- filesizeformat:将值格式化为一个'人类可读的'文件尺寸(KB,MB,byte)
-
{{ obj.file_size|filesizeformat }}
- length:返回值的长度,作用于字符串和列表
-
{{ value|length }}
- slice:切片,跟Python里的切片一样
-
{{ value|slice:'2:-1' }}
- date:时间格式化(传入的对象为:datetime.datetime.now())
-
{{ value|date:'Y-m-d H:i:s'}}
- save:django的模板中在往数据库提交数据时,会自动对一些不符合的数据(html标签或js代码等语法)进行转义,为了源html文件不被破坏,但有一些可能不需要转义,所以django用过滤器save来显示你确认过的安全的数据显示出来
-
<h2>{{ obj.ht_js|safe }}</h2> 'ht_js':'<script>alert(123)</script>' 这个js代码就会被执行
- truncatewords:在6个数量的字后截取其后字体用三个点代替
-
{{ value|truncatewords:6 }}
- cut:移除value所有的cut后面参数的字符串
-
{{ value|cut:' ' }}移除空格
- timesince:传入的时间对象跟当前的时刻的时间的一个时间差,用于写多长时间之前
-
{{ value|timesince }}
- timeuntil:当前时间对未来的时间的一个时间差,多长时间之后
-
{{ conference_date|timeuntil:from_date }}
c:自定义filter:自定义过滤器只是带有一个或两个位置参数的Python函数,所以不能用*args或**kwargs
创建filter的步骤:
在django项目中的app01下的文件夹中 创建一个templatetags包(package),在该包下创建一个py文件,来写自定义的filter函数 app01/templatetags/mytext-- #导入template from django import template #生成一个注册对象 register = template.Library() #装饰器(告诉django自定义了一个filter) @register.filter() def adjust(value,arg): print(arg) return value + arg['name']
在html文件中导入使用:
#导入自定义filter文件,跟import类似 {% load mytext %} #adjust是装饰器函数,后面参数可以传入一个对象 <h3>{{ obj.name|adjust:obj }}</h3>
注意:在创建一个filter对象时,都要重启一下
tags:
for循坏可用的一些参数:forloop本身是一个字典,属性用如下几项:
Variable | Description |
---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(从1开始) |
forloop.revcounter0 |
当前循环的倒序索引值(从0开始) |
forloop.first |
当前循环是不是第一次循环(布尔值) |
forloop.last |
当前循环是不是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
for...empty
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} 循环过程结束,没有符合的条件 <li>空空如也</li> {% endfor %} </ul>
if,elif和else:
{% if user_list|length > 5 %}
七座豪华SUV
{% else %}
黄包车
{% endif %}
if语句支持and, or , == ,<,>,<=,>=,in,not in,is,is not判断,但不支持连续判断
例如:a>b>c这是Python里可以实现,但是在模板语言里写连续判断格式: a>b and b>c
with:修改变量名称,重命名
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
csrf_token:
这个标签用于跨站请求伪造保护(当你开启一个服务的时候,别人也可以用自己的文件通过浏览器向你发送请求,有可能是恶意的)
所以django添加了csrf用来唯一确定是提交的表单是本页面发出的;
在页面(html文件)上form表单下写上
{% csrf_token %}
会在表单上添加隐藏的input框(里面是一个64位的随机数)
自定义simpletag:
和filter类似,都是在模板(html)中接收到数据时,可以对其过滤(操作,加功能,给模板变量加装饰器)
不同的是,filter只能接收1个或2个参数,而simpletag可以接收多个参数;
定义注册simple tag:
from django import template # register:记录; 登记簿; 登记,注册; 自动记录器; vt. 登记 register = template.Library() @register.simple_tag def text(*args,**kwargs): print(args) return args,kwargs
使用自定义simple tag
{% load mytest %}
<h1>{% text list key1=dict%}</h1> #传入两个对象,分别在装饰器中处理,然后返回给模板
改时间的配置:
1.settings中改 USE_L10N = False
2.DATETIME_FORMAT = 'Y-m-d H:i:s'
DATE_FORMAT = 'Y-m-d' 这时你的时间对象就会转为时间格式