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
相关产品推荐
相关产品推荐

