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

Django中ListView如何将两个不同模型的独立列表传入同个HTML模板?

解决方案

核心逻辑是重写视图的get_context_data方法,将两个独立的查询集都注入模板上下文,不需要再合并两个查询结果。

修改后的视图代码

# view.py
class SearchView(ListView):
    template_name = 'articles/search_view.html'

    # 保留默认查询集为Article的结果,对应模板的object_list
    def get_queryset(self):
        query = self.request.GET.get('q')
        return Article.objects.filter(
            Q(title__icontains=query) | Q(description__icontains=query)|
            Q(body__icontains=query) |
            Q(stocks_etfs_or_bonds__ticker__icontains=query) |
            Q(stocks_etfs_or_bonds__description__icontains=query) |
            Q(stocks_etfs_or_bonds__name__icontains=query) |
            Q(tags__name__icontains=query)
        )

    # 新增额外上下文变量
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        query = self.request.GET.get('q')
        # 把证券列表加到上下文里
        context['securities_list'] = StockETFBond.objects.filter(Q(name__icontains=query))
        return context

模板代码

直接使用你预期的写法即可,两个列表会独立渲染:

<!-- search_view.html -->
{% for object in object_list %}
    {{ object }}
{% endfor %}
{% for object in securities_list %}
    {{ object }}
{% endfor %}

可选优化

如果你不想依赖ListView默认的object_list命名,想让上下文变量更语义化,可以把两个查询集都放到get_context_data里自定义命名:

def get_queryset(self):
    # 不需要默认查询集的话可以返回空,或者直接改用TemplateView更合适
    return Article.objects.none()

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    query = self.request.GET.get('q')
    context['article_list'] = Article.objects.filter(...) # 填入你的Article查询条件
    context['securities_list'] = StockETFBond.objects.filter(Q(name__icontains=query))
    return context

对应模板直接使用article_list和securities_list遍历即可,代码可读性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:57:00