文章对应的B站视频:https://www.bilibili.com/video/BV1Tu41127Ca/

Django系列文章对应的目录:https://www.cnblogs.com/emanlee/p/15860241.html

 

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 变量,我们可以使用下面的代码来显示这个列表:

    {% for athlete in athlete_list %}

  • {{ athlete.name }}
  • {% endfor %}

 

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 %}

{{ athlete.name }}

    {% for sport in athlete.sports_played %}

  • {{ sport }}
  • {% endfor %}

{% endfor %}

ifequal/ifnotequal 标签

{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。

下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}

Welcome!

{% endifequal %}

和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:8

{% ifequal section 'sitenews' %}

Site News

{% else %}

No News Here

{% 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

查看原文