更改 ListView get_queryset? Django 中的分页

问题描述

大家好。 我在 Django 中的分页器遇到了一些麻烦。 我的数据库中有所有客户信息,所以我想做的是显示该信息,但我做了一个搜索功能,您可以在其中单击字母按钮,例如您单击 A,它将过滤所有客户姓氏以字母 A 开头,如果您单击 B ,它将过滤所有姓氏以 B 开头的客户,依此类推。这工作正常,问题是我还想每页显示 10 个客户,所以如果我有 20 个客户,他们的姓氏以字母 A 开头,您将看到的将是 10 个客户和一个显示 ( >> )或类似的东西,应该用分页解决,我添加了它,但它不起作用。 我认为问题是我的 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