如何在Django模板中移除仅获取首个元素的.all循环?
解决Django模板中获取关联对象首个元素的循环冗余问题
当然可以消除这类只为获取首个元素的循环,以下两种方案都能直接实现需求:
方案一:使用Django模板的first过滤器
直接通过first过滤器提取关联对象集合的首个元素,搭配with标签缓存结果避免重复计算,同时添加判断防止空对象报错。
修改后的sku部分代码:
{% with first_sku=i.skus.all|first %} {% if first_sku %} <h6 class="card-price">{{first_sku.price}} {{first_sku.currency}}</h6> {% endif %} {% endwith %}
同理,图片循环也可以用同样方式优化:
{% with first_img=i.images.all|first %} {% if first_img %} <img src={{first_img.img_url}} class="card-img-top" alt="..."> {% endif %} {% endwith %}
方案二:在视图层预处理数据
把数据处理逻辑移到视图中,提前为每个Product对象添加首个sku和图片的属性,让模板只负责渲染:
# 视图示例代码 products = Product.objects.prefetch_related('skus', 'images') for product in products: product.first_sku = product.skus.first() product.first_image = product.images.first()
模板中直接调用预处理好的属性:
{% if i.first_sku %} <h6 class="card-price">{{i.first_sku.price}} {{i.first_sku.currency}}</h6> {% endif %}
另外提一句:你模板里的slice:"0:"过滤器没有实际作用,它等同于保留所有元素,完全可以直接删除,改成{% for i in products %}即可。
内容的提问来源于stack exchange,提问作者Malik Zohaib Mustafa
相关产品推荐
相关产品推荐

