<p>这里不需要使用<a href="https://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_context_data" rel="nofollow noreferrer"><strong>^{<cd1>}</strong> [Django-doc]</a>,您可以重写<a href="https://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_queryset" rel="nofollow noreferrer"><strong>^{<cd2>}</strong> [Django-doc]</a>和{a3}来确定模板中列表的名称:</p>
<pre><code>class SearchResultsAdvancedView(django.views.generic.ListView):
template_name = 'ephemera/searchresults_advanced.html'
form = AdvSearchForm()
paginate_by = 10
model = Item
def item_type(self):
choose_collection = self.request.GET.get('choose_collection')
if choose_collection != 'All' or not self.request.GET.get('user_input'):
return None
choose_item = self.request.GET.get('choose_item')
if choose_item in ('book', 'image'):
return choose_item
return None
def <b>get_queryset</b>(self, *args, **kwargs):
item_type = self.get_item_type()
qs = super.get_queryset(*args, **kwargs)
if item_type is not None:
return qs.filter(material_type__iexact=item_type)
return qs.none()
def <b>get_context_object_name</b>(self, object_list):
item_type = self.get_item_type()
if item_type is not None:
return '{}_qs'.format(item_type)
return super().get_context_object_name(object_list)</code></pre>
<p>Django的逻辑将分页<code>QuerySet</code>本身,因此您不必担心这一点。这是由于<a href="https://docs.djangoproject.com/en/2.2/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_context_data" rel="nofollow noreferrer"><strong>^{<cd1>}</strong> [Django-doc]</a>实现了<a href="https://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-multiple-object/" rel="nofollow noreferrer"><strong>^{<cd6>}</strong> [Django-doc]</a>:</p>
<blockquote><pre><code>def get_context_data(self, *, object_list=None, **kwargs):
"""Get the context for this view."""
queryset = object_list if object_list is not None else self.object_list
page_size = self.get_paginate_by(queryset)
context_object_name = self.get_context_object_name(queryset)
if page_size:
<b>paginator, page, queryset, is_paginated = self.paginate_queryset(queryset, page_size)</b>
context = {
'paginator': paginator,
'page_obj': page,
'is_paginated': is_paginated,
'object_list': queryset
}
else:
context = {
'paginator': None,
'page_obj': None,
'is_paginated': False,
'object_list': queryset
}
if context_object_name is not None:
context[context_object_name] = queryset
context.update(kwargs)
return super().get_context_data(**context)</code></pre></blockquote>
<p>话虽如此,我的印象是造型不是很好。如果您有项目类型,那么定义一个<code>ItemType</code>模型是非常重要的。此外,最好使用Django的ORM生成查询,而不是原始查询。在</p>