如何在 Django ListView 中过滤和分页

J.A*_*noz 7 python django listview django-filter django-class-based-views

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

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

这是我的观点.py

PD:我有所有必需的进口品。

@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
Run Code Online (Sandbox Code Playgroud)

过滤器.py

import django_filters
from .models import Employee, Accident

class EmployeeFilter(django_filters.FilterSet):

    class Meta:
        model = Employee
        fields = {
            'rutEmployee' : ['startswith']
        }
Run Code Online (Sandbox Code Playgroud)

ara*_*lut 7

您应该覆盖get_queryset。这意味着您必须get_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
Run Code Online (Sandbox Code Playgroud)

并在employee_list.html中使用object_list而不是像filter这样:

{% for employee in object_list|dictsort:"id" reversed %}
Run Code Online (Sandbox Code Playgroud)