Как отобразить два отдельных списка двух разных моделей, объявленных в ListView, в одном HTML шаблоне в 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
Вернуться на верх