Django:模板
模板(templates)
语法
只需要记住两种特殊符号:
{{ }}
:变量相关{% %}
:逻辑相关
变量
变量名由字母数字和下划线组成。
格式如下:
{{ 变量名 }}
view中代码
1 | def template_test(request): |
模板中支持的写法:
1 | {# 取l中的第一个参数 #} |
Filters
语法:
{{ value|filter_name:参数 }}
default
1 | {{ value|default: "nothing"}} |
Tips:如果value值没传的话就显示nothing
length
语法格式:
{{ value|length }}
Tips:
|
左右没有空格没有空格没有空格
返回value的长度,如value=['a', 'b', 'c', 'd']
的话,就显示4。
filesizeformat
将值格式化为一个 人类可读的 文件尺寸 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)。例如:
1 | {{ value|filesizeformat }} |
slice
切片
1 | {{value|slice:"2:-1"}} |
date
格式化
1 | {{ value|date:"Y-m-d H:i:s"}} |
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。
但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器|safe
的方式告诉Django这段代码是安全的不必转义。
例如:
value = “点我“
1 | {{ value|safe}} |
truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“…”)结尾。
参数:截断的字符数
1 | {{ value|truncatechars:9}} |
自定义filter
自定义过滤器只是带有一个或两个参数的Python函数:
- 变量(输入)的值 - -不一定是一个字符串
- 参数的值 - 这可以有一个默认值,或完全省略
例如,在过滤器{{var | foo:“bar”}}
中,过滤器foo
将传递变量var
和参数bar
。
自定义filter代码文件摆放位置:
1 | app01/ |
编写自定义filter
1 | from django import template |
使用自定义filter
1 | {# 先导入我们自定义filter那个文件 #} |
Tags
标签看起来像是这样的: {% tag %}
。
标签比变量复杂得多,有些用于在输出中创建文本,有些用于控制循环或判断逻辑,有些用于加载外部信息到模板中供以后的变量使用。
一些标签需要开始和结束标签(即 {% 标签 %} ... 标签 内容 ... {% ENDTAG %}
)。
for
循环对象中每个元素。需要结束标签{% endfor %}
。
1 | <ul> |
for循环可用的一些参数:P
Variable | Description |
---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(从1开始) |
forloop.revcounter0 |
当前循环的倒序索引值(从0开始) |
forloop.first |
当前循环是不是第一次循环(布尔值) |
forloop.last |
当前循环是不是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
for … empty
1 | <ul> |
if,elif
和else
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
1 | {% if user_list %} |
当然也可以只有if和else
1 | {% if user_list|length > 5 %} |
with
定义一个中间变量
1 | {% with total=business.employees.count %} |
csrf_token
这个标签用于跨站请求伪造保护。
在页面的form表单里面写上{% csrf_token %}
注释
1 | {# ... #} |
注意事项
- Django的模板语言不支持连续判断,即不支持以下写法:
1 | {% if a > b > c %} |
- Django的模板语言中属性的优先级大于方法
1 | def xx(request): |
如上,我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的d.items()
方法,此时在模板中:
1 | {{ data.items }} |
默认会取d的items key的值。
母板
1 | <!DOCTYPE html> |
Tips:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。
继承母板
在子页面中在页面最上方使用下面的语法来继承母板。
1 | {% extends 'layouts.html' %} |
块(block)
通过在母板中使用{% block xxx %}
来定义块。
在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
1 | {% block page-main %} |
组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。
1 | {% include 'navbar.html' %} |
静态文件相关
1 | {% load static %} |
引用JS文件时使用:
1 | {% load static %} |
某个文件多处被用到可以存为一个变量
1 | {% load static %} |
使用get_static_prefix
1 | {% load static %} |
或者
1 | {% load static %} |
自定义simpletag
和自定义filter类似,只不过接收更灵活的参数。
定义注册simple tag
1 |
|
使用自定义simple tag
1 | {% load app01_demo %} |
inclusion_tag
多用于返回html代码片段
实例:templatetags/my_inclusion.py
1 | from django import template |
templates/snippets/result.html
1 | <ul> |
templates/index.html
1 | <!DOCTYPE html> |