Django中如何使用range同时遍历两个列表实现内容并排展示
问题根因
- Django模板不支持
列表.变量索引的取值语法,你写的dictItems.i会被模板解析为查找dictItems中名为i的属性,而非把i作为索引变量取值,因此无法拿到列表内容。 - 视图中传递的
range参数定义为range(0,len(data)-1),当列表长度为3时,该range仅生成0、1两个值,会漏掉最后一组数据。
最简实现方案
推荐直接在视图层用Python内置zip函数打包两个列表,生成配对的元组序列后传到模板直接遍历,无需额外处理索引,代码逻辑最清晰,改动量最小。
视图代码修改
def displayDict(request): data = ["a", "b", "c"] data2 = ["x", "y", "z"] # 打包两个列表为配对结构:[("a","x"), ("b","y"), ("c","z")] paired_data = zip(data, data2) return render(request, 'chattr.html', { "otherDict" : "other_bot", "otherDict2": "bot", "paired_data": paired_data })
模板代码修改
{% for item1, item2 in paired_data %} <p> <b>{{otherDict}}:</b> '{{item1}}' <br> <b>{{otherDict2}}:</b> '{{item2}}' <br> </p> {% endfor %}
如果确实不想修改视图层原有传参结构,也可以用模板过滤器实现按索引取值,把模板代码改为如下即可:
{% for i in dictItems %} <p> <b>{{otherDict}}:</b> '{{i}}' <br> <b>{{otherDict2}}:</b> '{{ dictItems_bot|slice:forloop.counter0|last }}' <br> </p> {% endfor %}
该写法通过forloop.counter0获取当前循环的0基索引,再配合slice和last过滤器拿到对应位置的元素,但可读性和性能都不如第一种方案,优先推荐用zip打包的方式。
内容的提问来源于stack exchange,提问作者Katie Melosto
相关产品推荐
相关产品推荐

