1. if/else 标签
基本语法格式如下:
{% if condition %}
... display
{% endif %}
或者:
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
特点:
1. 与python不同的是,结束if需要有endif标签,if后面没有冒号:
2. 同时也支持嵌套
3. {% if condition %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 或者对变量取反,例如:
{% if alist and blist %}
a 和 b 变量都是可用的。
{% endif %}
代码举例:
1. 在views.py中输入:
from django.shortcuts import render
def mydef(request):
views_num = 80
return render(request, "mytemp.html", {"num": views_num})
2. 在mytemp.html中输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>if/else演示</h1>
{%if num > 90 and num <= 100 %}
优秀
{% elif num > 60 and num <= 90 %}
合格
{% else %}
不合格
{% endif %}
</body>
</html>
3. 代码执行结果:成功!
2. for 标签
2.1 for 遍历列表,正向迭代
{% for %} 允许我们在一个序列上循环遍历。
与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。
每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。
代码举例:
1. 在views.py中输入:
from django.shortcuts import render
def mydef(request):
views_list = ["演示demo1","演示demo2","演示demo3","演示demo4"]
return render(request, "mytemp.html", {"num": views_list})
2. 在mytemp.html中输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>if/else演示</h1>
<ul>
{%for i in num%}
<li>{{i}} </li>>
{% endfor %}
</ul>>
</body>
</html>
3. 代码执行结果:成功!
2.2 for 遍历列表,反向迭代
1. 给标签增加一个 reversed 使得该列表被反向迭代:
<ul>
{%for i in num reversed%}
<li>{{i}} </li>>
{% endfor %}
</ul>>
2. 结果如下图:成功!
2.3 forloop 变量
在 {% for %} 标签里可以通过 {{forloop}} 变量获取循环序号。
- forloop.counter: 顺序获取循环序号,从 1 开始计算
- forloop.counter0: 顺序获取循环序号,从 0 开始计算
- forloop.revcounter: 倒序获取循环序号,结尾序号为 1
- forloop.revcounter0: 倒序获取循环序号,结尾序号为 0
- forloop.first(一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
- forloop.last(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False
举一个例子如下:
很简单,容易理解,不再赘述了
<body>
<h1>if/else演示</h1>
<ul>
{%for i in num %}
{{forloop.counter0}}
{% endfor %}
</ul>>
</body>
2.4 for循环遍历字典
可以直接用字典 .items 方法,用变量的解包分别获取键和值。
代码举例:
1. 在views.py中输入:
from django.shortcuts import render
def mydef(request):
views_list = {"name":"演示demo1","age":"18"}
return render(request, "mytemp.html", {"num": views_list})
2. 在mytemp.html中输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>if/else演示</h1>
<ul>
{%for i,j in num.items %}
<li>{{i}} ----{{j}}</li>>
{% endfor %}
</ul>
</body>
</html>
3. 代码执行结果:成功!
2.5 {% empty %}语句
可选的 {% empty %} 从句:在循环为空的时候执行(即 in 后面的参数布尔值为 False )。
代码举例:
1. 在views.py中输入:
from django.shortcuts import render
def mydef(request):
views_list = []
return render(request, "mytemp.html", {"num": views_list})
2. 在mytemp.html中输入:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>if/else演示</h1>
<ul>
{%for i in num %}
{{forloop.counter0}}
{%empty%}
数据为空
{% endfor %}
</ul>>
</body>
</html>
3. 代码执行结果:成功!
3. ifequal/ifnotequal 标签
{% ifequal %} 标签作用是 比较两个值,当他们相等时,显示:在 {% ifequal %} 和 {% endifequal %} 之中所有的值,格式如下:
{% ifequal lista listb %}
<h1>Welcome!</h1>
{% endifequal %}
{% ifequal %} 支持 {% else%} 标签,格式如下:
{% ifequal lista listb %}
<h1>Welcome!</h1>
{%else%}
<h1>Game over!</h1>
{% endifequal %}
4. 注释标签
注释使用 {# #},格式如下:
{# 这里写注释的代码 #}
5.include 标签
{% include %} 标签允许在模板中包含其它的模板的内容,格式如如下:
{% include "yourtemp.html" %}
6. csrf_token
csrf_token 用于form表单中,作用是跨站请求伪造保护。
如果不用{% csrf_token %}标签,在用 form 表单时,要再次跳转页面会报403权限错误。
用了{% csrf_token %}标签,在 form 表单提交数据时,才会成功。
原理解析:
首先,向服务器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签,该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。
然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf,原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断,这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误。