Python 如何在ListView Django中进行筛选和分页

Python 如何在ListView Django中进行筛选和分页,python,django,listview,django-class-based-views,django-filter,Python,Django,Listview,Django Class Based Views,Django Filter,当我想对使用django_filter创建的筛选器进行分页时,我遇到了一个问题,在我的模板中,它显示了查询集和筛选器,但分页不起作用,我想知道为什么会发生这种情况,以及您是否可以帮我 我将插入代码片段,以便您可以看到 这是我的观点 我有所有必要的进口货 @method_decorator(staff_member_required, name='dispatch') class EmployeeListView(ListView): model = Employee pagina

当我想对使用django_filter创建的筛选器进行分页时,我遇到了一个问题,在我的模板中,它显示了查询集和筛选器,但分页不起作用,我想知道为什么会发生这种情况,以及您是否可以帮我

我将插入代码片段,以便您可以看到

这是我的观点

我有所有必要的进口货

@method_decorator(staff_member_required, name='dispatch')
class EmployeeListView(ListView):
    model = Employee
    paginate_by = 4

    def dispatch(self, request, *args, **kwargs):
        if not request.user.has_perm('employee.view_employee'):
            return redirect(reverse_lazy('home'))
        return super(EmployeeListView, self).dispatch(request, *args, **kwargs)
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['filter'] = EmployeeFilter(self.request.GET, queryset = self.get_queryset())
        return context
过滤器.py

import django_filters
from .models import Employee, Accident

class EmployeeFilter(django_filters.FilterSet):

    class Meta:
        model = Employee
        fields = {
            'rutEmployee' : ['startswith']
        }

您应该覆盖
get\u queryset
。这意味着您必须将过滤器放入
get\u queryset
中,如下所示:

@method_decorator(staff_member_required, name='dispatch')
class EmployeeListView(ListView):
    model = Employee
    paginate_by = 4

    def dispatch(self, request, *args, **kwargs):
        if not request.user.has_perm('employee.view_employee'):
            return redirect(reverse_lazy('home'))
        return super(EmployeeListView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['filter'] = EmployeeFilter(self.request.GET, queryset = self.get_queryset())
        return context
    
    def get_queryset(self):
        queryset = super().get_queryset()
        return EmployeeFilter(self.request.GET, queryset=queryset).qs
{% for employee in object_list|dictsort:"id" reversed %}
并在employee_list.html中使用
object_list
而不是
filter
,如下所示:

@method_decorator(staff_member_required, name='dispatch')
class EmployeeListView(ListView):
    model = Employee
    paginate_by = 4

    def dispatch(self, request, *args, **kwargs):
        if not request.user.has_perm('employee.view_employee'):
            return redirect(reverse_lazy('home'))
        return super(EmployeeListView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['filter'] = EmployeeFilter(self.request.GET, queryset = self.get_queryset())
        return context
    
    def get_queryset(self):
        queryset = super().get_queryset()
        return EmployeeFilter(self.request.GET, queryset=queryset).qs
{% for employee in object_list|dictsort:"id" reversed %}

您好,谢谢您的帮助,应用您建议的更改,但它给了我以下错误:TypeError at/employee/filter\u queryset()在此行中为参数'queryset'获取了多个值:return EmployeeFilter().filter\u queryset(self.request.GET,queryset=queryset)您好,我刚刚应用了更改,它抛出了以下内容:filter\u queryset()接受2个位置参数,但提供了4个我认为您使用了rest筛选器。对不起,弄错了。请使用新的更改再试一次谢谢你非常好的朋友,它为我提供了完美的服务,你介意给我一个解释,为什么它现在与get_queryset功能一起工作吗?如果你在中看到多对象mixin的get_context_data方法,你知道queryset是如何分页的。每次使用ListView时,object_list都是分页的queryset,因此如果通过覆盖get_queryset来过滤queryset,object_list将被过滤。