if/else 标签
基本语法格式如下:
{% if condition %} ... display {% endif %}
或者:
{% if condition1 %} ... display 1 {% elif condition2 %} ... display 2 {% else %} ... display 3 {% endif %}
根据条件判断是否输出。if/else 支持嵌套。
{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:
{% if athlete_list and coach_list %} athletes 和 coaches 变量都是可用的。 {% endif %}
mysite456/mysite456/views.py 文件代码:
from django.shortcuts import render def mydef(request): views_num = 88 return render(request, "mytemp.html", {"num": views_num})
mysite456/templates/mytemp.html 文件代码:
{%if num > 90 and num <= 100 %} 优秀 {% elif num > 60 and num <= 90 %} 合格 {% else %} 不合格 {% endif %}
再访问访问 http://127.0.0.1:8003/mytemp/,可以看到页面:
for 标签
{% for %} 允许我们在一个序列上迭代。
与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。
每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。
例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
mysite456/mysite456/views.py 文件代码:
from django.shortcuts import render def mydef(request): views_list = ["简单示例demo","简单示例demo1","简单示例demo2","简单示例demo3",] return render(request, "mytemp.html", {"views_list": views_list})
mysite456/templates/mytemp.html 文件代码:
{% for i in views_list %} {{ i }} {% endfor %}
再访问访问 http://127.0.0.1:8003/mytemp/,可以看到页面:
给标签增加一个 reversed 使得该列表被反向迭代:
{% for athlete in athlete_list reversed %} ... {% endfor %}
mysite456/templates/mytemp.html 文件代码:
{% for i in views_list reversed%} {{ i }} {% endfor %}再访问访问 http://127.0.0.1:8003/mytemp/,可以看到页面:
遍历字典: 可以直接用字典 .items 方法,用变量的解包分别获取键和值。
mysite456/mysite456/views.py 文件代码:
from django.shortcuts import render def mydef(request): views_dict = {"name":"简单示例demo","age":18} return render(request, "mytemp.html", {"views_dict": views_dict})
mysite456/templates/mytemp.html 文件代码:
{% for i,j in views_dict.items %} {{ i }}---{{ j }} {% endfor %}
再访问访问 http://127.0.0.1:8003/mytemp/,可以看到页面:
在 {% for %} 标签里可以通过 {{forloop}} 变量获取循环序号。
- forloop.counter: 顺序获取循环序号,从 1 开始计算
- forloop.counter0: 顺序获取循环序号,从 0 开始计算
- forloop.revcounter: 倒序获取循环序号,结尾序号为 1
- forloop.revcounter0: 倒序获取循环序号,结尾序号为 0
- forloop.first(一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
- forloop.last(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False
mysite456/mysite456/views.py 文件代码:
from django.shortcuts import render def mydef(request): views_list = ["a", "b", "c", "d", "e"] return render(request, "mytemp.html", {"listvar": views_list})
mysite456/templates/mytemp.html 文件代码:
{% for i in listvar %} {{ forloop.counter }} {{ forloop.counter0 }} {{ forloop.revcounter }} {{ forloop.revcounter0 }} {{ forloop.first }} {{ forloop.last }} {% endfor %}
再访问访问 http://127.0.0.1:8003/mytemp/,可以看到页面:
{% empty %}
可选的 {% empty %} 从句:在循环为空的时候执行(即 in 后面的参数布尔值为 False )。
mysite456/mysite456/views.py 文件代码:
from django.shortcuts import render def mydef(request): views_list = [] return render(request, "mytemp.html", {"listvar": views_list})
mysite456/templates/mytemp.html 文件代码:
{% for i in listvar %} {{ forloop.counter0 }} {% empty %} Hello {% endfor %}
再访问访问 http://127.0.0.1:8003/mytemp/,可以看到页面:
可以嵌套使用 {% for %} 标签:
{% for athlete in athlete_list %} <h1>{{ athlete.name }}</h1> <ul> {% for sport in athlete.sports_played %} <li>{{ sport }}</li> {% endfor %} </ul> {% endfor %}
ifequal/ifnotequal 标签
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
下面的例子比较两个模板变量 user 和 currentuser :
{% ifequal user currentuser %} <h1>Welcome!</h1> {% endifequal %}
和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:8
{% ifequal section 'sitenews' %} <h1>Site News</h1> {% else %} <h1>No News Here</h1> {% endifequal %}
注释标签
Django 注释使用 {# #}。
{# 这是一个注释 #}
include 标签
{% include %} 标签允许在模板中包含其它的模板的内容。
下面这个例子都包含了 top.html 模板:
{% include "top.html" %}
csrf_token
csrf_token 用于form表单中,作用是跨站请求伪造保护。
如果不用{% csrf_token %}标签,在用 form 表单时,要再次跳转页面会报403权限错误。
用了{% csrf_token %}标签,在 form 表单提交数据时,才会成功。
解析:
首先,向服务器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签,该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。
然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf,原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断,这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误。
REF
https://www.runoob.com/django/django-template.html