Django模板是一个string文本,它用来分离一个文档的展现和数据。模板定义了placeholder和表示多种逻辑的tags
来规定文档如何展现,通常模板用来输出HTML,但是Django模板也能生成其它基于文本的形式。
###
变量的引用
{{ 变量名 }} |
Template和Context对象
>>> python manage.py shell (进入该django项目的环境) |
变量的查找
我们通过 context 传递的简单参数值主要是字符串,然而,模板系统能够非常简洁地处理更加复杂的数据结构,例如list、dictionary和自定义的对象。在 Django 模板中遍历复杂数据结构的关键是句点字符 .
# 首先,句点可用于访问列表索引,例如: |
标签
if/else 标签
{% if condition1 %} |
if
标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ).
注意:
if
标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的,这样的代码是不合法的:
{% if athlete_list and coach_list or cheerleader_list %} |
系统不支持用圆括号来组合比较操作。 如果你确实需要用到圆括号来组合表达你的逻辑式,考虑将它移到模板之外处理,然后以模板变量的形式传入结果吧。 或者,仅仅用嵌套的
if
标签替换.
for 标签
for
允许我们在一个序列上迭代,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。每一次循环中,模板系统会渲染在 for 和 endfor
之间的所有内容。
<ul> |
反向迭代
给标签增加一个 reversed
使得该列表被反向迭代:{% for athlete in athlete_list reversed %}
empty分句
for
标签支持一个可选的empty
分句,通过它我们可以定义当列表为空时的输出内容。
{% for athlete in athlete_list %} |
退出循环
Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue
语句,我们无法让当前迭代操作跳回到循环头部。
forloop变量
在每个for
循环里有一个称为forloop
的模板变量。这个变量有一些提示循环进度信息的属性。forloop 变量仅仅能够在循环中使用。 在模板解析器碰到endfor标签后,forloop就不可访问了。
forloop.counter
总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时forloop.counter
将会被设置为1。{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
forloop.counter0
类似于forloop.counter
,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。
forloop.revcounter
是表示循环中剩余项的整型变量。 在循环初次执行时forloop.revcounter
将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1。
forloop.revcounter0 类似于forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。
forloop.first
是一个布尔值,如果该迭代是第一次执行,那么它被置为True.
forloop.last
是一个布尔值;在最后一次执行循环时被置为True。
一个常见的用法是在一系列的链接之间放置管道符|
,另一个常见的用途是为列表的每个单词的加上逗号。
{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %} |
上面的模板可能会产生如下的结果:
Link1 | Link2 | Link3 | Link4 |
ifequal/ifnotequal 标签
ifequal
标签比较两个值,当他们相等时,显示在 ifequal
和 endifequal
之中所有的值。
下面的例子比较两个模板变量 user 和 currentuser :
{% ifequal user currentuser %} |
只有模板变量,字符串,整数和小数可以作为
ifequal
标签的参数。其他任何类型,例如Python的字典类型、列表类型、布尔类型,不能用在ifequal
中
注释标签
单行注释
{# 这是一个注释 #} |
用这种语法的注释不能跨越多行。 这个限制是为了提高模板解析的性能。
多行注释
{% comment %} |
URL标签
url的用法也很简单,只要在urlpatterns里使用它,附加一个name,如:
url(r'^article$','news_index' ,name="news_index"), |
Templates里 这样使用{%url 'name'%}
地址链接就能使用了。
name是全局的,你整个urlpatterns里只能一个唯一的name,这个道理应该好理解,就像网站的地址也是唯一性的。
csrf_token标签
用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效。
其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的
引用路由配置的地址
这里的参数来自urls.py中的定义的name=xxxx
<form action="{% url "xxxx"%}" >
<input type="text">
<input type="submit"value="提交">
{%csrf_token%}
</form>
禁止渲染
{% verbatim %} |
加载标签
{% load xxxx %} |
过滤器
过滤器通过管道符来实现。
add
给value加上一个数值
{{ user.age | add:”5” }} |
capfirst
第一个字母大写
{{ ‘good’| capfirst }} 返回”Good” |
center
输出指定长度的字符串,把变量居中{{ “abcd”| center:”50” }}
cut
删除指定字符串
{{ “You are not a Englishman” | cut:”not” }} |
dictsort
按某字段排序,变量必须是一个dictionary
{% for moment in moments | dictsort:”id” %} |
default
如果值不存在,则使用默认值代替
{{ value | default:”(N/A)” }} |
filesizeformat
增加数字的可读性,转换结果为13KB,89MB,3Bytes等
{{ 1024 | filesizeformat }} 返回 1.0KB |
floatformat
转换为指定精度的小数,默认保留1位小数
{{ 3.1415926 | floatformat:3 }} 返回 3.142 四舍五入 |
get_digit
从个位数开始截取指定位置的数字
{{ 123456 | get_digit:’1’}} |
linebreaks
用<p>或<br>
标签包裹变量
{{ “Hi\n\nDavid”|linebreaks }} 返回<p>Hi</p><p>David</p> |
ljust
输出指定长度的字符串,变量左对齐
{{‘ab’|ljust:5}} 返回 ‘ab ’ |
slice
切片操作, 返回列表
{{[3,9,1] | slice:’:2’}} 返回 [3,9] |
slugify
在字符串中留下减号和下划线,其它符号删除,空格用减号替换
{{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23 |
truncatewords
将字符串转换为省略表达方式
{{ 'This is a pen' | truncatewords:2 }} |
truncatewords_html
同上,但保留其中的HTML标签
{{ '<p>This is a pen</p>' | truncatewords:2 }} |
yesno
将布尔变量转换为字符串yes, no 或maybe
{{ True | yesno }} yes |
其他过滤器
过滤器 | 描述 |
---|---|
upper | 以大写方式输出 |
addslashes | 单引号加上转义号 |
date | 格式化日期 |
default_if_none | 如果值为None, 则使用默认值代替 |
divisibleby | 判断是否可以被数字整除 返回布尔类型 |
dictsortreversed | 按某字段倒序排序,变量必须是dictionary |
escape | 按HTML转义,比如将”<”转换为”<” |
first | 返回列表的第1个元素,变量必须是一个列表 |
length | 返回列表中元素的个数或字符串长度 |
linebreaksbr | 用<br/> 标签代替换行符 |
linenumbers | 为变量中的每一行加上行号 |
lower | 字符串变小写 |
length_is | 检查列表,字符串长度是否符合指定的值 |
join | 用指定分隔符连接列表 |
make_list | 将字符串转换为列表 |
pluralize | 根据数字确定是否输出英文复数符号 |
random | 返回列表的随机一项 |
removetags | 删除字符串中指定的HTML标记 |
rjust | 输出指定长度的字符串,变量右对齐 |
stringformat | 字符串格式化,语法同python |
time | 返回日期的时间部分 |
timesince | 以“到现在为止过了多长时间”显示时间变量 结果可能为 45days, 3 hours |
timeuntil | 以“从现在开始到时间变量”还有多长时间显示时间变量 |
title | 每个单词首字母大写 |
urlencode | 将字符串中的特殊字符转换为url兼容表达方式 |
urlize | 将变量字符串中的url由纯文本变为链接 |
wordcount | 返回变量字符串中的单词数 |