DTL语言学习(二){% for %}标签的使用

首先新建一个测试项目,然后新建一个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.htmlbody中的代码:

<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.firstforloop.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 %}中的内容了。

总结

  1. 模板中的for…in…没有continue和break语句,这一点和Python中有很大的不同,一定要记清楚!
  2. 获得字典的某个值可以使用<字典名称>.<key>来获取。不能像python那样来获取。<字典名称>[key]这样是不对的,DTL语言不能识别,只有python才能识别。
  3. 想获取列表中的某个值可以用<列表名>.<下标>来获取。也不能像python那样来获取。<列表名>[下标]这样也是不对的,DTL语言也不能识别,只有python才能识别。

猜你喜欢

转载自blog.csdn.net/xujin0/article/details/83353293