如何在 Django 的一个 HTML 模板中显示在 ListView 中声明的两个不同模型的两个单独列表?

How to display two separate lists of two different models declared in ListView in one HTML template in Django?

我已经为搜索引擎编写了一个 ListView。我想从两个不同模型的字段中提取数据。首先,我为每个模型声明了单独的列表。然后我将它们组合成一个列表,如下所示。

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

    def get_queryset(self):
        query = self.request.GET.get('q')
        object_list = 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))
        securities_list = StockETFBond.objects.filter(Q(name__icontains=query))
        search_result = list(chain(object_list, securities_list))
        return search_result

在这种情况下,模板将显示一个包含两个模型的列表。

search_view.html template now
{% for object in object_list %}
    {{ object }}
{% endfor %}

但我希望能够在模板中显示两个不同模型的两个单独列表,如下所示。

search_view.html
{% for object in object_list %}
    {{ object }}
{% endfor %}
{% for object in securities_list %}
    {{ object }}
{% endfor %}

我该怎么做?

默认情况下,ListView 只会发送查询集返回的数据。要获得两个列表,您必须覆盖上下文。

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    query = self.request.GET.get('q')
    # Additional context data
    context['securities_list'] = StockETFBond.objects.filter(Q(name__icontains=query))
    return context