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

Django视图无法将上下文字典传递至HTML模板问题求助

Django上下文传递到HTML模板失败排查解决

我尝试将包含主表字段及Media表关联数据的内容传递到HTML模板,但页面无法获取上下文数据。视图中的两次测试打印均返回正确值,且有一个逻辑类似的POST请求视图能正常运行,因此问题出在上下文传递到模板的方式上。

相关代码

views.py

def listing(request, listing_id):
    if listing_id:
        print(f"listing id: {listing_id}")
        results = ListingDetail.objects.filter(listing_id=listing_id).prefetch_related('media_set').all()
        print(results)
        return render(request, 'members/listing_detail.html', {'listing': results})
    else:
        return render(request, 'general/search.html', {'listing': 'no data'})

HTML模板片段

<div class="card">
    listing_id = {{ listing.listing_id }}
    <div class="card-header">
    <div id="carousel_main" class="carousel slide" data-bs-ride="carousel">
    <div class="carousel-inner">
    {% for media_item in listing.media_set.all %}
    <div class="carousel-item {% if forloop.counter == 1 %}active{% endif %}">
    <img src="{{ media_item.media_url }}" class="d-block" alt="" width="100%">
    </div>
    {% endfor %}
    </div>

urls.py

urlpatterns = [
        path('listing/<int:listing_id>', views.listing, name='listing'),
    ]

问题原因与解决方案

核心问题

你使用filter()查询返回的是QuerySet(多条记录的集合),但模板里直接以单个对象的方式访问属性(如listing.listing_id)和关联数据(listing.media_set.all()),自然无法获取到值。

方案1:获取单个对象(推荐)

因为listing_id是唯一标识,对应单条记录,改用get()方法获取单个ListingDetail对象,同时保留预取关联数据的逻辑:

def listing(request, listing_id):
    if listing_id:
        print(f"listing id: {listing_id}")
        try:
            # 预取关联的media_set并获取单条记录
            listing_obj = ListingDetail.objects.prefetch_related('media_set').get(listing_id=listing_id)
            print(listing_obj)
            return render(request, 'members/listing_detail.html', {'listing': listing_obj})
        except ListingDetail.DoesNotExist:
            # 处理记录不存在的情况
            return render(request, 'members/listing_detail.html', {'listing': None})
    else:
        return render(request, 'general/search.html', {'listing': 'no data'})

此时原模板的写法无需修改,直接访问单个对象的属性和关联数据即可。

方案2:兼容多条记录(若业务需要)

如果确实需要处理多条结果,模板里需要先遍历QuerySet:

<div class="card">
{% for item in listing %}
    listing_id = {{ item.listing_id }}
    <div class="card-header">
    <div id="carousel_main" class="carousel slide" data-bs-ride="carousel">
    <div class="carousel-inner">
    {% for media_item in item.media_set.all %}
    <div class="carousel-item {% if forloop.counter == 1 %}active{% endif %}">
    <img src="{{ media_item.media_url }}" class="d-block" alt="" width="100%">
    </div>
    {% endfor %}
    </div>
{% empty %}
    <p>未找到相关记录</p>
{% endfor %}
</div>

内容的提问来源于stack exchange,提问作者Topher76

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:20:10