我正在尝试分页从视图.py,从多个上下文对象中进行选择。代码示例条件语句中只显示了两个选项,但我还有几个选项,基本上涵盖了表单提交中的所有选项。但是,最后只返回一个上下文,将上下文传递给模板视图进行分页。在
我还尝试在中全局设置分页设置.py,但它不起作用。在
我以前看过下面的文章,作为getcontext对象分页的指南。在
How to perform pagination for context object in django?
从视图.py公司名称:
from django.shortcuts import render
import django.views.generic
from django.http import HttpResponse
from django.template import loader
from django.template import RequestContext
from ephemera.models import *
from ephemera.serializers import ItemSerializer
from rest_framework import generics
from ephemera.forms import SearchForm, AdvSearchForm
from itertools import chain
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger
class SearchResultsAdvancedView(django.views.generic.ListView):
template_name = 'ephemera/searchresults_advanced.html'
form = AdvSearchForm()
paginate_by = 10
model = Item
def get_context_data(self, **kwargs):
context = super(SearchResultsAdvancedView, self).get_context_data(**kwargs)
choose_collection = self.request.GET.get('choose_collection')
user_input = self.request.GET.get('user_input')
choose_item = self.request.GET.get('choose_item')
bookpage = False
imagepage = False
if choose_collection == 'All' and user_input == '' and choose_item == 'book':
context['book_qs'] = Item.objects.raw('SELECT * FROM ephemera_item WHERE ephemera_item.material_type LIKE %s', ['book']);
bookpage = True
elif choose_collection == 'All' and user_input == '' and choose_item == 'image':
context['image_qs'] = Item.objects.raw('SELECT * FROM ephemera_item WHERE ephemera_item.material_type LIKE %s', ['image']);
imagepage = True
if bookpage:
paginator = Paginator(context, self.paginate_by)
page = self.request.GET.get('page')
try:
book_qs = paginator.page(page)
except PageNotAnInteger:
book_qs = paginator.page(1)
except EmptyPage:
book_qs = paginator.page(paginator.num_pages)
context['book_qs'] = book_qs
elif imagepage:
paginator = Paginator(context, self.paginate_by)
page = self.request.GET.get('page')
try:
image_qs = paginator.page(page)
except PageNotAnInteger:
image_qs = paginator.page(1)
except EmptyPage:
image_qs = paginator.page(paginator.num_pages)
context['image_qs'] = image_qs
return context
返回的错误包括:
异常值:不可损坏类型:“切片”
异常位置:c:\users\administrator\appdata\local\programs\python36-32\lib\site packages\django\core\分页器.py第70行
这里不需要使用^{} [Django-doc],您可以重写^{} [Django-doc]和{a3}来确定模板中列表的名称:
Django的逻辑将分页} [Django-doc]实现了^{} [Django-doc]:
QuerySet
本身,因此您不必担心这一点。这是由于^{话虽如此,我的印象是造型不是很好。如果您有项目类型,那么定义一个
ItemType
模型是非常重要的。此外,最好使用Django的ORM生成查询,而不是原始查询。在原始代码示例中的一个问题是RawQuerySets不适用于get_context_data中显示的分页代码,这些代码应该是带有过滤器的模型对象,否则分页代码将失败。例如
然而,在这种情况下,RawQuerySets是必需的,并且很有用,因为附加的(未显示)查询具有复杂的内部连接等,使用过滤器很难完成。在
One solution for casting a raw query set as a list for pagination is answered in:
另外,RawQuerySet的django paginator模块也可以用来帮助解决这篇文章中链接的问题。在
django-paginator-rawqueryset
在模块的帮助下,原始查询集可以有效地与给定的分页器代码一起使用,以利用上下文对象返回要传递给模板的上下文。然后,模板和显示页面导航的典型代码一起,还能够利用附加到上下文的变量来根据需要显示数据。在
^{pr2}$显示的问题示例,来自视图.py,有点“暴力”,可以在类内定义的帮助下进行更紧凑的编码,如第一个答案所示。这里显示了使用另一个模块解决问题的方法:
相关问题 更多 >
编程相关推荐