Django 模板标签(if for 注释 include)

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/,可以看到页面:

Django 模板标签(if for 注释 include)

 

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/,可以看到页面:

Django 模板标签(if for 注释 include)

 

 

给标签增加一个 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/,可以看到页面:

Django 模板标签(if for 注释 include)

 

 

遍历字典: 可以直接用字典 .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/,可以看到页面:

Django 模板标签(if for 注释 include)

 

在 {% 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/,可以看到页面:

Django 模板标签(if for 注释 include)

 

 

{% 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/,可以看到页面:

Django 模板标签(if for 注释 include)

 

 

可以嵌套使用 {% 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

上一篇:[Open Source]基于YOLOv3与Django框架的Web应用-YOLOv3_Detect_Web


下一篇:python测试开发django-181.自定义过滤器(除法取余)