You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:57:03