【问题标题】:How to display two separate lists of two different models declared in ListView in one HTML template in Django?如何在 Django 的一个 HTML 模板中显示在 ListView 中声明的两个不同模型的两个单独列表?
【发布时间】:2021-08-28 17:23:03
【问题描述】:

我为搜索引擎编写了一个 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 %}

我该怎么做?

【问题讨论】:

    标签: django django-models django-views django-forms django-templates


    【解决方案1】:

    默认情况下,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 2018-09-24
      • 2023-02-05
      • 2020-05-29
      • 2013-05-30
      • 2012-07-01
      • 2020-09-23
      • 1970-01-01
      相关资源
      最近更新 更多