Django学习笔记-标签
模板系统带有内置的标签和过滤器,下面提供了一个多数通用标签和过滤器的简要说明:
标签if/else
if/else
{% if %}标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在{% if %}和{% endif %}之间的任何内容,例如:
{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% endif %}
{% else %}标签是可选的:
{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% else %}
<p>Get back to work.</p>
{% endif %}
在Python和Django模板系统中,以下对象的相当于布尔值为False:
空列表([])
空元组(())
空字典({})
空字符串(”)
零值(0)
特殊对象(None)
对象Fasle(很明显)
也可以在自定义的对象里定义他们的布尔值属性(这个是python的高级用法)。
除上述以外,其余均为True。
{% if %}标签接受and、or或者not关键字来对多个变量做判断,或者对变量取反(not),eg:
{% if athlete_list and coach_list %}
Both athletes and coaches are available.
{% endif %}
{% if not athlete_list %}
There are not athletes.
{% endif %}
{% if athlete_list or coach_list %}
There are no athletes or there are some coaches.
{% endif %}
{% if not athlete_list or coach_list %}
There are no athletes or there are some coaches.
{% endif %}
{% if athlete_list and not coach_list %}
There are some athletes and absolutely no coaches.
{% endif %}
注意:
1. if标签不允许在同一个标签内同时使用and和or,因为逻辑上会模糊。
2. 系统不支持用圆括号来组合比较操作,如果需要组合比较,可以考虑将它移到模板之外处理,然后以模板变量的形式传入结果,或者用嵌套的{% if %}标签替换,eg:
{% if athlete_list %}
{% if coach_list or cheerleader_list %}
We have athletes, and either coaches or cheerleaders!
{% endif %}
{% endif %}
- 多次使用同一个逻辑操作符是没有问题的,但是不能把不同的操作符组合起来,eg:
{% if athlete_list or coach_list or parent_list or teacher_list %}
- if标签里并没有{% elif %}标签,都是使用嵌套的{% if %}标签来达成同样的效果,eg:
{% if athlete_list %}
<p>Here are the athletes: {{ athlete_list }}.</p>
{% else %}
<p>No athletes are available.</p>
{% if coach_list %}
<p>Here are the coaches: {{ coach_list }}.</p>
{% endif %}
{% endif %}
- 一定记住要是有{% endif %}标签来关闭每一个{% if %}标签。
标签for
for
{% for %} 允许我们在一个序列上迭代。 与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。 每一次循环中,模板系统会渲染在 {% for %} 和{% endfor %} 之间的所有内容。eg:
给定一个运动员列表athlete_list变量
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
给标准增加一个reversed使得该列表被反向迭代:
{% for athlete in athlete_list reversed %}
...
{% endfor %}
可以嵌套使用{% for %}标签:
{% for athlete in athlete_list %}
<h1>{{ athlete.name }}</h1>
<ul>
{% for sport in athlete.sports_played %}
<li>{{ sport }}</li>
{% endfor %}
</ul>
{% endfor %}
在执行循环之前先检测列表的大小是一个通常的做法,当列表为空时输出一些特别的提示:
{% if athlete_list %}
{% for athlete in athlete_list %}
<p>{{ athlete.name }}</p>
{% endfor %}
{% else %}
<p>There are no athletes. Only computer programmers.</p>
{% endif %}
for标签支持一个可选的”{% empty %}”分句,通过它我们可以定义当列表为空时的输出内容,下面的例子等价于上一个:
{% for athlete in athlete_list %}
<p>{{ athlete.name }}</p>
{% empty %}
<p>There are no athletes. Only computer programmers.</p>
{% endfor %}
注意:
- Django不支持退出循环操作。如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。
- Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。
在每个”{% for %}”循环里有一个称为”forloop”的模板变量。这个变量的作用是提示循环进度信息的属性。
forloop.counter总是一个表示当前循环的执行次数的整数计数器。这个计数器是从1开始的,所以在第一次循环时forloop.counter将会被置为1。
{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
forloop.counter0这个计数器是从0开始的,第一次执行循环时这个变量会被设置为0。
forloop.revcounter是表示循环中剩余项的整型变量,第一次执行循环时这个变量会被设置为序列中项的总和,最后一次循环执行中,这个变量将被置为1。
forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。
forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为True。
forloop.last 是一个布尔值,在最后一次执行循环时被置为True。
forloop.parentloop 是一个指向当前循环的上一级循环的forloop 对象的引用(在嵌套循环的情况下)。
forloop 变量仅仅能够在循环中使用。 在模板解析器碰到{% endfor %}标签后,forloop就不可访问了。
标签ifequal/ifnotequal
ifequal
{% ifequal %}标签比较两个值,当他们相等时,显示在{% ifequal %}和{% endifequal %}之间所有的值。
下面的例子比较两个模板变量user和currentuser:
{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}
参数可以是硬编码的字符串,随便用单引号或者双引号引起来,所以下列代码都是正确的:
{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% endifequal %}
{% ifequal section "community" %}
<h1>Community</h1>
{% endifequal %}
和{% if %}类似,{% ifequal %}支持可选的{% else %}标签:
{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}
<h1>No News Here</h1>
{% endifequal %}
只有模板变量,字符串,整数和小数可以作为{% ifequal %}标签的参数,下面是合法参数的例子:
{% ifequal variable 1 %}
{% ifequal variable 1.23 %}
{% ifequal variable 'foo' %}
{% ifequal variable "foo" %}
其他任何类型,例如python的字典类型、列表类型、布尔类型,不能用在{% ifequal %}中,下面是些错误的例子:
{% ifequal variable True %}
{% ifequal variable [1, 2, 3] %}
{% ifequal variable {'key': 'value'} %}
注意:
如果你需要判断变量的真假,建议使用{% if %}标签来代替{% ifequal %}。
注释#
Django模板语言也使用{##}来提供代码注释。
{# 单行注释 #}
{% comment %}
多行
注释
{% endcomment %}
过滤器
模板过滤器是在变量被现实前修改它的值得一个简单方法,过滤器使用管道字符,如下所示:
{{ name | lower }}
显示的内容是变量{{ name }}被过滤器lower处理后的结果,它的功能是转换文本为小写。
过滤管道可以被*套接*,也就是说,一个过滤器管道的输出又可以作为下一个管道的输入,eg:
{# 实现查找列表的第一个元素并将其转化为大写 #}
{{ my_list | first | upper }}
有些过滤器有参数,过滤器的参数跟随冒号之后并且总是以双引号包含:
{# 显示变量bio的前30个词 #}
{{ bio | truncatewords:"30" }}