<学习笔记>从零开始自学Python-之-web应用框架Django(四)Django常用标签

一对花括号和百分号包围的文本是模板标签,Django框架有一些内置的常用标签

1、{% if %} 标签

{% if %} 计算变量的值,如果为真(即存在、不为空,不是假值),模板系统显示 {% if %} 和 {% endif %} 之间的内容。

如上一篇中的例子,我们判断同学的性别,然后根据性别称呼他们为“大侠”或“女侠”

{% if s.0 == 'male' %}
<li>{
   
   { s.1 }}大侠</li>
{% else %}
<li>{
   
   { s.1 }}女侠</li>
{% endif %}
        

if 标签还可以有一个或多个 {% elif %} 子句,支持使用 and、or 或 not 测试多个变量

{% if s.age <18 %}
<li>{
   
   { s.name }}少侠</li>
{% elif s.sex = 'male' and s.age<50 %}
<li>{
   
   { s.name }}大侠</li>
{% elif s.sex = 'female' and s.age<50 %}
<li>{
   
   { s.name }}女侠</li>
{% elif s.age >=50 %}
<li>{
   
   { s.name }}前辈</li>
{% else %}
<li>{
   
   { s.name }}壮士</li>
{% endif %}

同一个标签中可以同时使用 and 和 or,前者的优先级较高。

在 if 标签中使用括号是无效的句法。如果想指明优先级,应该使用嵌套的 if 标签。

if 标签还可以使用 ==、!=、、= 和 in 等运算符

模板标签中的布尔运算符
运算符 示例
== {% if somevar == x %}…
!= {% if somevar != x %} …
< {% if somevar < 100 %} …
> {% if somevar > 10 %} …
<= {% if somevar <= 100 %}...
>= {% if somevar >= 10 %} …
in

{% if bc in abcdef %}

2、{% for %} 标签 

        这个标签用于迭代序列中的各个元素。与 Python 的 for 语句一样,句法是 for X in Y,其中 Y 是要迭 代的序列,X 是单次循环中使用的变量。每次迭代时,模板系统会渲染 {% for %} 和 {% endfor %} 之间的内容。

上一篇举例的  {% for s in student_list %},就可以列出student_list中的所有学生

如果需要迭代由列表构成的列表,可以把每个子列表中的值拆包到独立的变量中。 比如说上下文中有一个包含 (x,y) 坐标点的列表,名为 points,可以使用下述模板输出这些坐标点: {% for x, y in points %}

There is a point at { { x }},{ { y }}

{% endfor %} 如果需要访问字典中的元素,也可以使用这个标签。如果上下文中包含一个字典 data,可以使用下述模板显示字典的键和值:

{% for key, value in data.items %} { { key }}: { { value }} {% endfor %}

通常,迭代列表之前要先检查列表是否为空,如果为空可以插入一些特殊字符

因此 for 标签支持一个可选的 {% empty %} 子句,用于定义列表为空时显示的内容。

{% for s in student_list %}
<p>{
   
   { s.name }}</p>
{% empty %}
<p>这位侠客没有名字</p>
{% endfor %}

与Python不同的是 :在循环结束之前,无法“跳出”。如果需要这么做,修改要迭代的变量,只包含需要迭代的值。 同样,也没有“continue”语句,不能立即返回到循环的开头。

在 {% for %} 循环内部,可以访问一个名为 forloop 的模板变量。这个变量有几个属性,通过它们可以获知 循环进程的一些信息:
• forloop.counter 的值是一个整数,表示循环的次数。这个属性的值从 1 开始,因此第一次循环时, forloop.counter 等于 1。下面举个例子:

{% for item in todo_list %}

{
   
   { forloop.counter }}: {
   
   { item }}

{% endfor %} 

• forloop.counter0 与 forloop.counter 类似,不过是从零开始的。第一次循环时,其值为 0。

• forloop.revcounter 的值是一个整数,表示循环中剩余的元素数量。第一次循环时,forloop.revcounter的值是序列中要遍历的元素总数。最后一次循环时,forloop.revcounter 的值为 1。

• forloop.revcounter0 与 forloop.revcounter 类似,不过索引是基于零的。第一次循环时,forloop.revcounter0 的值是序列中元素数量减去一。最后一次循环时,forloop.revcounter0 的值为 0。
• forloop.first 是个布尔值,第一次循环时为 True。需要特殊处理第一个元素时很方便:

{% for object in objects %} 
{% if forloop.first %}
<li class="first">
{% else %}
<li>
{% endif %} 
{
   
   { object }}
</li>
{% endfor %} 

• forloop.last 是个布尔值,最后一次循环时为 True。经常用它在一组链接之间放置管道符号:

{% for link in links %} 
{
   
   { link }}{% if not forloop.last %} | {% endif %} 
{% endfor %}

上述模板代码的输出可能是: Link1 | Link2 | Link3 | Link4

3、{% ifequal %} 标签

这个标签比较两个值,如果相等,显示 {% ifequal %} 和 {% endifequal %} 之间的内容。

{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}

与 {% if %} 一样,{% ifequal %} 标签支持可选的 {% else %} 子句:

{% ifequal user currentuser %}
<h1>Welcome</h1>
{% else %}
<h1>Getout</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 标签可以替换成 if 标签和 == 运算符。

{% ifnotequal %} 的作用与 ifequal 类似,不过它测试两个参数是否不相等。

ifnotequal 标签可以替换成 if 标签和 != 运算符。

4、{% block %} 标签

定义可由子模板覆盖父模板的块。详情见上一篇帖子。

5、{% comment %}标签

忽略 {% comment %} 和 {% endcomment %} 之间的全部内容。

起始标签可以添加可选的注解,例如说明为何要 注释掉代码。

comment 标签不能嵌套。

6、 {% csrf_token %}标签

这个标签提供 CSRF 防护。在用表单进行交互的时候要加上这个标签。

7、{% extends %}标签

表明所在模板扩展某个父模板。这个标签有两种用法:

1. {% extends "base.html" %}(有引号),以字面值 "base.html" 为父模板的名称。

2. {% extends variable %} 以 variable 的值为父模板的名称。如果 variable 的求值结果是一个字符串, Django 以那个字符串为父模板的名称;如果求值结果是一个 Template 对象,Django 使用那个对象为父模板。

8、{% cycle %}标签

        每执行这个标签一次输出参数中的一个值。第一次执行输出第一个参数,第二次执行输出第二个参数,以此 类推。所有参数都输出一遍之后,回到第一个参数,再依次输出。这个标签在循环中特别有用: {% for o in some_list %}.


{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}

第一次迭代生成的 HTML 使用 row1 类,第二次迭代使用 row2 类,第三次迭代使用 row1 类,以此类推。参数的值也可以通过变量指定。

假如有两个模板变量 rowvalue1 和 rowvalue2,可以像这样在二者的值之间切 换:

{% for o in some_list %}
<tr class="{% cycle rowvalue1 rowvalue2 %}">
...
</tr>
{% endfor %}

此外,也可以混用变量和字符串:

{% for o in some_list %}
<tr class="{% cycle 'row1' rowvalue2 'row3' %}">
...
</tr>
{% endfor %}

一个 cycle 标签中可以使用任意多个值(以空格分开)。放在单引号(')或双引号(")中的值视作字符串字面量,没有引号的视为模板变量。

9、{% include %}标签

加载一个模板,在当前上下文中渲染。这是在模板中引入其他模板的方式。模板的名称可以是一个变量:

{% include template_name %}

或者硬编码的字符串(有引号):

{% include "foo/bar.html" %}

10、{% load %}标签

加载自定义的模板标签。例如,下述模板代码加载 somelibrary 和 package 包中 otherlibrary 注册的全部标签和过滤器:

{% load somelibrary package.otherlibrary %}

此外,还可以使用 from 参数有选择地从库中加载具体的过滤器和标签。 下述示例从 somelibrary 中加载名为 foo 和 bar 的标签或过滤器:

{% load foo bar from somelibrary %}

11、{% filter %}标签

使用一个或多个过滤器过滤内容块。过滤器的内容下个帖子详细说。

Guess you like

Origin blog.csdn.net/qq_41597915/article/details/126314146