如何在Django模板的Packages循环中对应输出另一列表元素
解决Django模板循环中对应输出另一个列表元素的问题
方案一:视图层合并数据(推荐)
直接在视图中将packages和对应价格列表打包成包含两者的结构,模板循环时可直接获取对应数据,代码更清晰易维护。
修改视图代码:
package_main_prices_list = [] for i in packages: package_price = float(i.startup_payment) calculated_price = round(max(package_price, package_price * last_price / 28000)) package_main_prices_list.append(calculated_price) # 合并packages和对应价格为字典列表 package_with_prices = [ {'package': pkg, 'price': price} for pkg, price in zip(packages, package_main_prices_list) ] context = { 'package_with_prices': package_with_prices, } return render(request, 'pages/shop.html', context)
模板中使用:
{% for item in package_with_prices %} <p>{{ item.package.name }}<br>{{ item.price }}<br>{{ item.package.date }}</p> {% endfor %}
方案二:自定义模板过滤器实现列表索引
如果不想修改视图结构,可通过自定义模板过滤器支持列表索引操作。
- 在你的Django应用下创建
templatetags目录(无则新建),并新建custom_filters.py文件:
from django import template register = template.Library() @register.filter def index(lst, idx): """根据索引获取列表元素""" try: return lst[int(idx)] except (IndexError, ValueError, TypeError): return ''
- 在模板中加载过滤器并使用:
{% load custom_filters %} {% for package in packages %} <p>{{ package.name }}<br>{{ package_main_prices_list|index:forloop.counter0 }}<br>{{ package.date }}</p> {% endfor %}
注:
forloop.counter0是Django模板内置变量,代表当前循环的索引(从0开始),正好对应价格列表的下标。
内容的提问来源于stack exchange,提问作者Md. Abdul Hamid
相关产品推荐
相关产品推荐

