25Django for标签详解
Posted mengdie1978
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了25Django for标签详解相关的知识,希望对你有一定的参考价值。
25、Django for标签详解
25、Django for标签详解
通过上一节的《Django if标签详解》的讲解,我相信大家对于模板标签已经不再陌生,在本节我们再给大家隆重介绍一位最熟悉的陌生人,那就是 for 标签,学习它的时候,我们也要结合 Python 语言中的 for 循环,这样很便于大家理解与使用它。
- for标签的使用
for 标签用于对可迭代对象进行遍历,包括列表、元组等,它与 Python 中的 for 语法是类似的。for 标签 使用时也需要和 endfor 标签配合使用,当然它也有不同之处,那就是它多了一个可选的 empty 标签,比如用它来显示当列表不存在或者列表中元素为空的时候要显示的内容,它的使用格式如下:
% for 变量 in 可迭代对象 %
... 循环语句
% empty %
... 可迭代对象无数据时填充的语句
% endfor %
我们通过一个具体的实例来看一下它的用法,在 views.py 中添加如下代码:
from django.template import Template,Context
def test_for(request):
#调用template()方法生成模板
t1=Template("""
% for item in list %
<li> item </li>
% empty %
<h1>如果找不到你想要,可以来C语言中文网(网址:http://c.biancheng.net/)</h1>
% endfor %
""")
#调用 Context()方法
c1= Context(\'list\':[\'Python\',\'Java\',\'C\',\'Javascript\',\'C++\'])
html=t1.render(c1)
return HttpResponse(html)
并配置路由映射关系,如下所示:
path(\'test_for/\',views.test_for)
提示:与 Python 中的 for 循环不同的是,for 标签只能一次性地遍历完列表中的元素,不能中断(break),也不能跳过(continue)。
2. for标签嵌套使用
for 标签同样可以嵌套使用,示例代码如下所示:
def test01_for(request):
#使用嵌套for标签依次遍历列表取值
website=Template("""
% for course in list01 %
<div>
% for coursename in course %
<p><b> coursename </b></p>
% endfor %
</div>
% endfor %
""")
webname=Context(\'list01\':[[\'Django\',\'Flask\',\'Tornado\'],[\'c语言中网\',\'Django官网\',\'Pytho官网\']])
html=website.render(webname)
return HttpResponse(html)
- forloop变量详解
在 for 标签还提供了内置变量 forloop ,我们可以访问这个变量的属性从而获取 for 循环迭代过程中的一些信息,比如
forloop.first,它的返回值是一个布尔值,当 for 循环迭代第一个元素的时候返回 True, 若有其余元素则返回的是 False。forloop
的属性主要有以下几个:forloop变量属性
变量 描述
forloop.counter 用来计数,查看当前迭代第几个元素(从1开始索引)
forloop.counter0 用来计数,查看当前迭代第几个元素(从0开始索引)
forloop.revcounter 表示当前循环中剩余的未被迭代的元素数量(从1开始索引)
forloop.revcounter0 表示当前循环中剩余的未被迭代的元素数量(从0开始索引)
forloop.first 如果当前迭代的是第一个元素,则为True
forloop.last 如果当前迭代的是最后一个元素,则为True
forloop.parentloop 在嵌套循环中,用来引用外层循环的 forloop
实例说明如下所示:
```
def test_forloop(request):
a=Template("""
% for item in lists %
<div>
<p><b> forloop.counter : item </b></p>
</div>
% endfor %
""")
b=Context(\'lists\':[\'c语言中网\',\'Django官网\',\'Pytho官网\'])
html=a.render(b)
return HttpResponse(html) #数字与元素以 1:\'c语言中文网\' 的形式出现
```
```
提示:forloop 变量只能在 for 与 endfor 之间使用,它的 first 和 last 属性,可以通过 if 标签对当前迭代元素做逻辑判断,而像 counter 属性,常用于调试程序。
```
027:for标签使用详解
for标签使用详解:
for...in... 标签: for...in... 类似于 Python 中的 for...in... 。可以遍历列表、元组、字符串、字典等一切可以遍历的对象。示例代码如下:
{% for person in persons %} <p>{{ person.name }}</p> {% endfor %}
如果想要反向遍历,那么在遍历的时候就加上一个 reversed 。示例代码如下:
{% for person in persons reversed %} <p>{{ person.name }}</p> {% endfor %}
遍历字典的时候,需要使用 items 、 keys 和 values 等方法。在 DTL 中,执行一个方法不能使用圆括号的形式。遍历字典示例代码如下:
{% for key,value in person.items %} <p>key:{{ key }}</p> <p>value:{{ value }}</p> {% endfor %}
在 for 循环中, DTL 提供了一些变量可供使用。这些变量如下:
- forloop.counter :当前循环的下标。以1作为起始值。
- forloop.counter0 :当前循环的下标。以0作为起始值。
- forloop.revcounter :当前循环的反向下标值。比如列表有5个元素,那么第一次遍历这个属性是等于5,第二次是4,以此类推。并且是以1作为最后一个元素的下标。
- forloop.revcounter0 :类似于forloop.revcounter。不同的是最后一个元素的下标是从0开始。
- forloop.first :是否是第一次遍历。
- forloop.last :是否是最后一次遍历。
- forloop.parentloop :如果有多个循环嵌套,那么这个属性代表的是上一级的for循环。
3. for...in...empty 标签:这个标签使用跟 for...in... 是一样的,只不过是在遍历的对象如果没有元素的情况下,会执行 empty 中的内容。示例代码如下:
{% for person in persons %} <li>{{ person }}</li> {% empty %} <li>暂时还没有任何人</li> {% endfor %}
实例代码如下:
views.py:
from django.shortcuts import render # Create your views here. # my_dict = {"name": ‘tom‘} # my_list = ["jerry",] # my_tupe = ("alice",) my_dict = {‘books‘:[ {"name":‘红楼梦‘,‘author‘:‘曹雪芹‘,"price":150}, {"name":‘水浒传‘,‘author‘:‘罗贯中‘,"price":140}, {"name":‘三国演义‘,‘author‘:‘施耐庵‘,"price":160}, {"name":‘西游记‘,‘author‘:‘吴承恩‘,"price":130}, ], # "comment": [‘内容不错‘, "真的假的啊"], "comment": [], } def index(request): return render(request, ‘index.html‘, context=my_dict) # return render(request, ‘index.html‘, context={‘age‘: 20}) # return render(request, ‘index.html‘, context={‘username‘: "jack_cheng", # ‘list1‘:my_dict, # ‘list2‘:my_list, # ‘list3‘:my_tupe})
url.py:
from django.contrib import admin from django.urls import path from front import views urlpatterns = [ path(‘admin/‘, admin.site.urls), path(‘front/‘, views.index), ]
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {#<p>字符串:{{ username }}</p>#} {#<p>字典:{{ list1.name }}</p>#} {#<p>列表:{{ list2.0 }}</p>#} {#<p>元组:{{ list3.0 }}</p>#} {#{% if age < 18 %}#} {# <p>您是未成年人</p>#} {#{% elif age >= 18 and age < 80 %}#} {# <p>您是成年人</p>#} {#{% else %}#} {# <p>您是老年人</p>#} {#{% endif %}#} <table> <thead> <tr> <td>序号</td> <td>作者</td> <td>书名</td> <td>价格</td> </tr> </thead> <tbody> {% for book in books %} {% if forloop.first %} <tr style="background: red;"> {% elif forloop.last %} <tr style="background: pink"> {% else %} <tr> {% endif %} <td>{{ forloop.counter }}</td> <td>{{ book.name }}</td> <td>{{ book.author }}</td> <td>{{ book.price }}</td> </tr> {% endfor %} </tbody> </table> {% for item in comment %} <li>{{ item }}</li> {% empty %} <li>抱歉内容为空</li> {% endfor %} </body> </html>
以上是关于25Django for标签详解的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Django 模板文件的 for 循环中使用条件标签
Django - 一个计数器模板标签,即使使用嵌套的 for 标签也能很好地工作