如何在Django HTML模板中迭代URL列表生成url标签跳转链接
问题根因
你写的代码有三个核心语法问题,不符合Django模板的规则:
- 模板语法不支持直接调用Python内置函数,
enumerate()无法在模板中直接执行 - Django模板原生不支持动态索引取值,
category_links[idx]的写法无法被解析器识别 - 原HTML代码存在标签语法错误,
<a>和<div>的左尖括号缺失
方案1:视图层提前打包数据(最推荐)
符合Django「模板轻逻辑、视图处理数据」的设计规范,无需额外扩展功能:
- 调整视图代码,将分类名称列表和链接名称列表打包为元组后传递给模板:
# 你的视图函数代码 def home(request): # 你原有分类名称列表,顺序要和category_links一一对应 categories = ["你实际的分类名称列表"] category_links = ['journals', 'proceedings', 'books', 'articles_in_books', 'talks', 'poster', 'habilitations', 'phd_thesis', 'bachelor_master_diploma_thesis', 'lectures', 'conferences', 'calls_and_awards', 'telegrams_and_circulars'] # 打包两个列表为配对的元组列表 category_pairs = list(zip(categories, category_links)) return render(request, "你的模板路径.html", {"category_pairs": category_pairs})
- 模板直接遍历打包后的列表即可:
{% for category, link_name in category_pairs %} <div class="box"> <a href="{% url link_name %}">{{ category }}</a> </div> {% endfor %}
方案2:自定义模板过滤器实现动态索引(无需改视图)
如果不想调整视图层代码,可以自定义一个简单的过滤器支持按索引取列表值:
- 在你的应用目录下新建
templatetags文件夹,创建两个文件:- 空文件
__init__.py custom_filters.py,写入如下代码:
- 空文件
from django import template register = template.Library() @register.filter def index(lst, idx): return lst[idx]
- 模板顶部加载自定义过滤器,然后结合
forloop.counter0遍历:
{% load custom_filters %} {% for category in categories %} <div class="box"> <a href="{% url category_links|index:forloop.counter0 %}">{{ category }}</a> </div> {% endfor %}
内容的提问来源于stack exchange,提问作者David Haase
相关产品推荐
相关产品推荐

