如何在Django中用正则匹配模型photo_前缀字段并筛选非空值用于模板渲染
Django遍历匹配photo字段并渲染非空图片的实现方案
方案:视图层预处理(推荐)
Django模板本身不支持复杂的正则匹配逻辑,推荐将字段筛选逻辑放在视图层处理,处理完成后将可用的图片URL列表直接传给模板渲染,符合MTV架构的分工原则。
1. 修改views.py代码
import re from django.shortcuts import get_object_or_404, render from .models import Listing def listing(request, listing_id): listing = get_object_or_404(Listing, pk=listing_id) # 筛选符合规则的非空photo字段的URL photo_urls = [] for field_name in dir(listing): # 匹配 photo_ + 数字 的字段名规则 if re.match(r'^photo_[0-9]+$', field_name): photo_field = getattr(listing, field_name) # 仅保留有值的字段的URL if photo_field: photo_urls.append(photo_field.url) context = { 'listing': listing, 'photo_urls': photo_urls } return render(request,"listings/listing.html", context)
2. 修改listing.html模板
直接遍历预处理好的photo_urls列表渲染即可:
{% for url in photo_urls %} <div class="col-md-2"> <a href="{{ url }}" data-lightbox="home-images"> <img src="{{ url }}" alt="" class="img-fluid"> </a> </div> {% endfor %}
补充说明
如果你的photo字段数量是固定上限的,也可以不用正则,直接循环1到最大数值判断字段是否存在且非空,性能比正则匹配更高:
# 假设最多有10个photo字段,photo_1到photo_10 for i in range(1, 11): field_name = f'photo_{i}' if hasattr(listing, field_name): photo_field = getattr(listing, field_name) if photo_field: photo_urls.append(photo_field.url)
内容的提问来源于stack exchange,提问作者Joaquim A Pinto
相关产品推荐
相关产品推荐

