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