更改 ListView get_queryset? django 中的分页器
changeing ListView get_queryset? pagination in django
大家好。
我在 django 的分页器上遇到了一些麻烦。
我的数据库中有所有客户信息,所以我想做的是显示该信息,但我制作了一个搜索功能,您可以在其中点击一个字母按钮,例如您点击 A,它将过滤所有他们的客户姓氏以字母A开头,如果您点击B,它将过滤所有姓氏以字母B开头的客户,依此类推。这工作正常,问题是我还想每页显示 10 个客户,所以如果我有 20 个客户,他们的姓氏以字母 A 开头,您将看到 10 个客户和一个栏,上面写着 ( < << page 1 page 2 >>> ) 或类似的东西,应该用分页器解决,我添加了它,但它不起作用。
我认为问题在于,也许我的 get 函数正在重写 ListView 中的 get_query 函数?我尝试了不同的东西,但我不确定。
这是我在视图中的代码:
class ExpedientView(ListView):
queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
template_name = 'dashboard-admin/portfoliorecords.html'
paginate_by = 10
def get(self,request):
if request.GET['letter'] == '':
context_object_name = 'portfolios'
queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
context = queryset
else:
letter = request.GET['letter']
context_object_name = 'portfolios'
queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name').filter(owner__last_name__istartswith=letter)
context = queryset
return render(request, 'dashboard-admin/portfoliorecords.html', {'portfolios': context})
get(self,request) 函数完美运行,但是 paginated_by 的第一部分不起作用。
在我添加 get 函数并过滤所有客户之前,分页器工作正常,因此在模板中,代码可以正常工作。
如果您需要做的只是动态更改查询集,而不是重写 get
(调用视图中的适当函数,它将执行所有分页任务等),您应该重写 get_queryset
:
class ExpedientView(ListView):
queryset = Portfolio.objects.filter(products__isnull=True)
template_name = 'dashboard-admin/portfoliorecords.html'
paginate_by = 10
ordering = 'owner__last_name' # Put the ordering here instead of specifying it in the queryset
def get_queryset(self):
queryset = super().get_queryset()
letter = self.request.GET.get('letter')
if letter:
queryset = queryset.filter(owner__last_name__istartswith=letter)
return queryset
您必须修改 def get_queryset(self)
方法而不是 def get(self, request)
方法
删除 def get(self, request)
方法和下面的代码。
def get_queryset(self):
queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
letter = request.GET.get('letter', None)
if letter:
queryset.filter(owner__last_name__istartswith=letter)
return queryset
大家好。 我在 django 的分页器上遇到了一些麻烦。 我的数据库中有所有客户信息,所以我想做的是显示该信息,但我制作了一个搜索功能,您可以在其中点击一个字母按钮,例如您点击 A,它将过滤所有他们的客户姓氏以字母A开头,如果您点击B,它将过滤所有姓氏以字母B开头的客户,依此类推。这工作正常,问题是我还想每页显示 10 个客户,所以如果我有 20 个客户,他们的姓氏以字母 A 开头,您将看到 10 个客户和一个栏,上面写着 ( < << page 1 page 2 >>> ) 或类似的东西,应该用分页器解决,我添加了它,但它不起作用。 我认为问题在于,也许我的 get 函数正在重写 ListView 中的 get_query 函数?我尝试了不同的东西,但我不确定。 这是我在视图中的代码:
class ExpedientView(ListView):
queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
template_name = 'dashboard-admin/portfoliorecords.html'
paginate_by = 10
def get(self,request):
if request.GET['letter'] == '':
context_object_name = 'portfolios'
queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
context = queryset
else:
letter = request.GET['letter']
context_object_name = 'portfolios'
queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name').filter(owner__last_name__istartswith=letter)
context = queryset
return render(request, 'dashboard-admin/portfoliorecords.html', {'portfolios': context})
get(self,request) 函数完美运行,但是 paginated_by 的第一部分不起作用。
在我添加 get 函数并过滤所有客户之前,分页器工作正常,因此在模板中,代码可以正常工作。
如果您需要做的只是动态更改查询集,而不是重写 get
(调用视图中的适当函数,它将执行所有分页任务等),您应该重写 get_queryset
:
class ExpedientView(ListView):
queryset = Portfolio.objects.filter(products__isnull=True)
template_name = 'dashboard-admin/portfoliorecords.html'
paginate_by = 10
ordering = 'owner__last_name' # Put the ordering here instead of specifying it in the queryset
def get_queryset(self):
queryset = super().get_queryset()
letter = self.request.GET.get('letter')
if letter:
queryset = queryset.filter(owner__last_name__istartswith=letter)
return queryset
您必须修改 def get_queryset(self)
方法而不是 def get(self, request)
方法
删除 def get(self, request)
方法和下面的代码。
def get_queryset(self):
queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
letter = request.GET.get('letter', None)
if letter:
queryset.filter(owner__last_name__istartswith=letter)
return queryset