【Django】template - 插入 Python 代码

Posted by 西维蜀黍 on 2019-11-10, Last Modified on 2021-09-21

if/else 标签

基本语法格式如下:

{% if condition %}
   ... display
{% endif %}

或者:

{% if condition1 %}
   ... display 1
{% elif condiiton2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

根据条件判断是否输出。if/else 支持嵌套。

Note:模板标签中的变量是不需要用 {% raw %}{{ {% endraw %} 来包裹的。

and、or 或not

{% raw %}{% if %}{% endraw %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反(not),例如:

{% if athlete_list and coach_list %}
     athletes 和 coaches 变量都是可用的
{% endif %}

注意,{% raw %}{% if %}{% endraw %} 标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的,这样的代码是不合法的:

{% if athlete_list and coach_list or cheerleader_list %}

系统不支持用圆括号来组合比较操作。 如果你确实需要用到圆括号来组合表达你的逻辑式,考虑将它移到模板之外处理,然后以模板变量的形式传入结果吧。 或者,仅仅用嵌套的 {% raw %}{% if %}{% endraw %} 标签替换

for 标签

常规用法

{% raw %}{% for %}{% endraw %} 允许我们在一个序列上迭代。与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。

每一次循环中,模板系统会渲染在 {% raw %}{% for %}{% endraw %} 和 {% raw %}{% endfor %}{% endraw %} 之间的所有内容。

例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

反向迭代

给标签增加一个 reversed 使得该列表被反向迭代:

{% for athlete in athlete_list reversed %}

嵌套使用 {% raw %}{% for %}{% endraw %}

可以嵌套使用 {% raw %}{% for %}{% endraw %} 标签。

在执行循环之前先检测列表的大小是一个通常的做法,当列表为空时输出一些特别的提示。 for 标签支持一个可选的 {% raw %}{% empty %}{% endraw %} 分句,通过它我们可以定义当列表为空时的输出内容。

下面的例子与用if-else实现等价:

{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}

Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。

执行次数的整数计数器

在每个 {% raw %}{% for %}{% endraw %} 循环里有一个称为 forloop 的模板变量。这个变量有一些提示循环进度信息的属性。

forloop.counter 总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时forloop.counter 将会被设置为1。

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

Reference