首页 > 解决方案 > 如何在 ListView Django 中过滤和分页

问题描述

当我想对使用 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

过滤器.py

import django_filters
from .models import Employee, Accident

class EmployeeFilter(django_filters.FilterSet):

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

标签: pythondjangolistviewdjango-class-based-viewsdjango-filter

解决方案


您应该覆盖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

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

{% for employee in object_list|dictsort:"id" reversed %}

推荐阅读