Django模板遍历多列表问题:模板无内容显示
问题原因
Django模板语言不支持直接调用Python内置函数(比如zip()),所以你在模板中写的{%for a, b in zip(l1, l2)%}是无效语法,导致模板无法渲染出内容。
解决方法
这里提供两种常用的解决思路:
方法一:在视图中提前合并列表
直接在views.py中将需要遍历的列表用zip()合并好,再传递给模板:
修改后的views.py代码:
def exa(request): list1 = ["apple", "banana", "cherry"] list2 = [1, 5, 7] list3 = [True, False, False] # 合并list1和list2 zipped_lists = zip(list1, list2) context = { 'l1': list1, 'l2': list2, 'l3': list3, 'zipped': zipped_lists } return render(request, 'patient_registration/111.html', context)
对应的模板代码:
{% for a, b in zipped %} {{a}} {{b}}<br> {% endfor %}
这种方法简单直接,适合只需要在单个视图中处理的场景。
方法二:自定义模板过滤器
如果需要在多个模板中频繁使用列表合并的功能,可以自定义一个模板过滤器:
在你的Django应用目录下创建
templatetags文件夹,里面新建两个文件:__init__.py(空文件即可)和custom_filters.py。在
custom_filters.py中编写过滤器代码:
from django import template register = template.Library() @register.filter(name='zip') def zip_lists(list_a, list_b): return zip(list_a, list_b)
- 在模板中先加载自定义过滤器,再使用:
{% load custom_filters %} {% for a, b in l1|zip:l2 %} {{a}} {{b}}<br> {% endfor %}
如果需要合并两个以上的列表,可以修改过滤器函数来接受更多参数,或者链式使用过滤器(不过链式适合少数情况)。
内容的提问来源于stack exchange,提问作者Tushar Parmar
相关产品推荐
相关产品推荐

