小谈Django中的模板系统
Django的模板系统
常用语法
Django模板中只需要记住两种特殊符号 : {{ }}和{% %} ;
{{ }}表示变量 , 在模板渲染的时候替换成值 ; {% %} -- "标签"( tag ) : 表示逻辑相关的操作 ;
变量
注意 :
- 变量中都是通过
.
来取相关的内容 , 模板语法中没有[ ]和( ) ; - 取索引 : 直接 .数字, 如{{ lst.0 }} ; 如果超出索引范围就是不显示 , 不报错 ; 但是索引值为负数时会报错 , 如{{ lst.-1 }}
- 字典取值 : 直接.键 , 如{{ dic.name }} ; 字典取键 : 直接.keys , 如{{ dic.keys }}
- 对象取属性或方法 : 都是直接.属性/方法 ,如{{ obj.name }} 或者 {{ obj.run }} ; 调用对象的方法时 , 只能调用不带参数的方法 ;
- 当模板系统遇到一个
.
时 , 会按照如下的顺序取查询 ( 如类和字典或者列表重名时 ) :- 在字典中查询
- 属性或者方法中查询
- 数字索引中查询
过滤器 - Filters
Filters翻译过来叫过滤器 , 用来修改变量的显示结果 ;
语法: {{ value | filter_name:参数 }} ; 参数最多只有一个(可以没有), 并且 : 两边没有空格!!!!!
default
default的意思:xxx是变量,如果没有这个变量或者变量为空(空列表,空字典,None都是空)时,用default的值;如果变量本身有值,就显示自己的值 ;
{{ xxx|default:'没有传参' }}
filesizeformat
这个过滤器没有参数,filesize:'文件大小',比如定义filesize=100,加上这个过滤器就显示100bytes,如果数值较大会自动更新为合适的单位,最大显示到PB ;
{{ filesize|filesizeformat }}
add
-
加法 : 参数可以是正数也可以是负数;参数写成字符串('-11')也可以,会硬转化成整数再去加 ;
{{ age|add:-11 }}
-
拼接 : 变量和参数都是字符串,就是字符串的拼接;如果变量和参数都是列表就是列表的拼接 ;
{{ string|add:' is dsb' }}
lower
所有字母都变成小写 ;
{{ string|lower }}
upper
所有字母都变成大写 ;
{{ string|upper }}
length
显示长度,这里:列表加上自己再显示其长度,就显示hobby_list长度的2倍 ;
{{ hobby_list|add:hobby_list | length }}
slice
切片,''中写的内容和Python中[]里面写的内容相同 ;
{{ hobby_list|slice:'::2' }}
first
取第一个元素 ;
{{ hobby_list|first }}
last
取最后一个元素 ;
{{ string|last }}
join
将列表中的元素按照什么拼接 ;
{{ hobby_list|join:'-' }}
truncatechars
显示多少字符长度的内容,最后显示的...也计入10之中,也就是说如果参数是3,那就显示三个点了 ;
{{ long|truncatechars:10 }}
truncatewords
显示多少单词长度的内容,按空格分 ;
{{ long|truncatewords:10 }}
date
日期时间格式化 ;
-
这个日期时间格式化之后显示的就是按照这个格式(如:'2017-01-01 12:12:12') ;
{{ now|date:'Y-m-d H:i:s' }}
-
如果在settings.py中把USE_L10N = False 再加一行:DATETIME_FORMAT = 'Y-m-d H:i:s' 这样的效果和格式化之后的一样,如果前端页面需要格式化的变量比较多时可以选择这个:这里还可以只格式化日期或者只格式化时间:DATE_FORMAT和TIME_FORMAT ;
-
如果不用格式化,只修改settings.py中的语言和时区就是显示成'2017年01月01日 12:12:12'
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义 , 但是有时候我们不希望这些HTML元素被转义 , 这里就是使用safe
value = '<a href="http://www.baidu.com">百度</a>'
{{ value|safe }}
模板的标签
用{% %}表示的就是标签
for循环
# {{ forloop.counter0 }} 0,1,2 从0开始
# {{ forloop.revcounter }} 3,2,1
# {{ forloop.revcounter0 }} 2,1,0 到0结束
# {{ forloop.first }} 第一个是True,其余都是false ; lase反之
# {{ forloop.parentloop }} 本层循环的外层循环的变量
# {% empty %} 有数据显示数据,没有数据时可以自定义显示内容
<ui>
{% for hobby in hobby_list %}
<li>{{ forloop.counter }} {{ hobby }}</li>
{% empty %}
<li>没有数据</li>
{% endfor %}
</ui>
if...else
if...else : 有些情况并不支持 , 这里举例说明
不支持算数运算
# 1+1>1,无法完成,要借助于过滤器
{% if 1|add:1 > 1 %}
真
{% edif %}
不支持连续判断
# 不支持连续判断
# 说明: 10>5>1 在Python中显示为True(10>5:True,5>1:True;两个True取交集所以成立);而模板语法类似于JS(10>5为True,True>1就是False)
with
相当于取别名 , 只能在with范围内使用 : 可以将一些临时用的比较频繁 , 名称又比较复杂的变量用with取别名 ;
{% with ... as ... %} # 这行也可以写成 : {% with ...=... %}
...
{% endwith %}
csrf_token
这个标签可以跨站请求伪造保护 ;
在前端页面的form表单里面写上{% csrf_token %} , 在form表单中有一个隐藏的input标签 name='csrfmiddlewaretoken' value是一直在变的
母版和继承
母版
提取多个页面公共部分放在一个母版中 , 定义上多个block块 , 让子页面重新复写
继承
- {% extends '母板的名字' %} ;
- 重写block块 ;
# 母版 --> index.html
{% block content %}
可以被替换的内容
{% endblock %}
# 继承页面中
{% extends 'index.html' %}
{% block content %}
替换成自己的内容
{% endblock %}
注意 :
- {% extends '母板的名字' %} 模板名字的引号必须加上 , 不加引号会被当作变量 ;
- {% extends '模板的名字' %} 的上面不要写内容 ;
- 要替换母版的内容都放在block块中 ;
- 可以定义多个block块 ;
组件
可以将常用的页面内容( 一小段代码段 ) , 如导航条,页面信息等组件保存在单独的html文件中 , 然后在需要使用的地方按如下语法导入即可 .
{% include 'nav.html' %}
注意 :
- 导入组件时 , 如果组件需要导入bootstrap , 需要在页面另行导入 ;
- 母版如果导入了组件 , 继承母版的页面不用再另行导入组件 ;
用上{% load static %} 就不用担心settings.py中的STATIC_URL = '/static/'修改名字了 ;
{% load static %}
# 页面中导入css,js的上面写上{% load static %},导入时可以这样写
# {% static 'css/js等静态文件的相对路径' %} 如下面:
<link rel='stylesheet' href="{% static 'plugins/bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
{% get_static_prefix %} 就是获取settings.py中的STATIC_URL = '/static/' 的'/static/' , 如果需要单独使用一次STATIC_URL的值 , 可以用这个 ,了解即可 .