首先新建一个测试项目,然后新建一个for_demo
的app,在app中新建一个urls.py文件,在新建一个templates的文件夹。里面新建一个for.html
的文件,然后将app添加至settings.py文件中,然后配置好一切路径,在for_demo中的views.py中渲染模板for.html,这些都配置成功后,我们就可以进行{% for %}标签的学习了。
在views.py中编写代码:
from django.shortcuts import render
# Create your views here.
def index(request):
books = ['三国演义','西游记','红楼梦','水浒传']
return render(request,'for.html',{'books':books})
在for.htmlbody
中写入代码:
<ul>
{% for book in books %}
<li>{{ book }}</li>
{% endfor %}
</ul>
然后就可以输入网址进行测试了
效果如下
如果在for后面添加一个reversed
,就会反向遍历列表。
<ul>
{% for book in books reversed %}
<li>{{ book }}</li>
{% endfor %}
</ul>
这样我们就能使用for
遍历一个列表了,接下来我们传入一个字典来进行遍历。
修改views中的代码
from django.shortcuts import render
# Create your views here.
def index(request):
books = ['三国演义','西游记','红楼梦','水浒传']
persion = {'name':'张三','age':18,'sex':'男'}
return render(request,'for.html',{'books':books,'persion':persion,})
再修改for.html
中body
中的代码:
<ul>
{% for book in books reversed %}
<li>{{ book }}</li>
{% endfor %}
</ul>
<ul>
{% for key in persion.keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
<ul>
{% for value in persion.values %}
<li>{{ value }}</li>
{% endfor %}
</ul>
<ul>
{% for key,value in persion.items %}
{{ key }}<b>:</b>{{ value }}<br>
{% endfor %}
</ul>
然后我们查看效果图:
这样,我们就实现了对一个字典的遍历。
接下来我们实现一下稍微复杂一点的遍历,列表中嵌套字典
在views中写入:
from django.shortcuts import render
# Create your views here.
def index(request):
books = ['三国演义', '西游记', '红楼梦', '水浒传']
persion = {'name': '张三', 'age': 18, 'sex': '男'}
detail_books = [
{'name':'三国演义','author':'罗贯中','price':99},
{'name':'西游记','author':'吴承恩','price':199},
{'name':'红楼梦','author':'曹雪芹','price':299},
{'name':'水浒传','author':'施耐庵','price':399},
]
return render(request,'for.html',{'books':books,'persion':persion,'detail_books':detail_books})
for.html
中的body写入:
<ul>
{% for book in books reversed %}
<li>{{ book }}</li>
{% endfor %}
</ul>
<ul>
{% for key in persion.keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
<ul>
{% for value in persion.values %}
<li>{{ value }}</li>
{% endfor %}
</ul>
<ul>
{% for key,value in persion.items %}
{{ key }}<b>:</b>{{ value }}<br>
{% endfor %}
</ul>
<table>
<thead>
<tr>
<td>序号</td>
<td>书名</td>
<td>作者</td>
<td>价格</td>
</tr>
</thead>
<tbody>
{% for detail_book in detail_books %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ detail_book.name }}</td>
<td>{{ detail_book.author }}</td>
<td>{{ detail_book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
然后输入网址查看效果
注: DTL中for中提供的一些变量:
forloop.counter
:当前循环的下标。以1作为起始值。forloop.counter0
:当前循环的下标。以0作为起始值。forloop.revcounter
:当前循环的反向下标值。比如列表有5个元素,那么第一次遍历这个属性是等于5,第二次是4,以此类推。并且是以1作为最后一个元素的下标。forloop.revcounter0
:类似于forloop.revcounter。不同的是最后一个元素的下标是从0开始。forloop.first
:是否是第一次遍历。forloop.last
:是否是最后一次遍历。forloop.parentloop
:如果有多个循环嵌套,那么这个属性代表的是上一级的for循环。
在刚才的例子中我们就用到了forloop.counter
这个变量。
接下来我们来测试一下forloop.first
和forloop.last
这两个变量
for.html
中<table>
中修改代码为:
<table>
<thead>
<tr>
<td>序号</td>
<td>书名</td>
<td>作者</td>
<td>价格</td>
</tr>
</thead>
<tbody>
{% for detail_book in detail_books %}
{% if forloop.first %}
<tr style="background: brown">
{% elif forloop.last %}
<tr style="background: greenyellow">
{% else %}
<tr>
{% endif %}
<td>{{ forloop.counter }}</td>
<td>{{ detail_book.name }}</td>
<td>{{ detail_book.author }}</td>
<td>{{ detail_book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
我们对遍历进行了判断,如果为第一次遍历,就将背景颜色改为brown
,如果是最后一次遍历,就将背景颜色改为greenyellow
,其它的都不进行改变。
效果图为
for标签中还有一个empty
标签
这个标签使用跟for...in...
是一样的,只不过是在遍历的对象如果没有元素的情况下,会执行empty
中的内容。
我们在views中添加一个空的列表movies
,然后将其传递至for.html
中,然后在body中添加一个for循环:
{% for movie in movies %}
<p>{{ movie }}</p>
{% empty %}
<h1>还没有任何电影</h1>
{% endfor %}
效果图为
而如果我们在views
中的movies
中添加一个数据,就不会执行{% empty %}
中的内容了。
总结
- 模板中的for…in…没有continue和break语句,这一点和Python中有很大的不同,一定要记清楚!
- 获得字典的某个值可以使用
<字典名称>.<key>
来获取。不能像python那样来获取。<字典名称>[key]
这样是不对的,DTL语言不能识别,只有python才能识别。 - 想获取列表中的某个值可以用
<列表名>.<下标>
来获取。也不能像python那样来获取。<列表名>[下标]
这样也是不对的,DTL语言也不能识别,只有python才能识别。