python - 如何在 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']
}
解决方案
您应该覆盖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 %}
推荐阅读
- sockets - 接受 udp 选择的错误
- css - Flex Layout 混合行和列
- validation - AMP 验证错误
- codeigniter - 如何从对象字符串中获取所需的标签
- javascript - 其他块不符合我的条件
- jenkins - 如何将文件从 SSH 远程主机复制到 Jenkins 服务器。sshpass 不起作用
- android - android项目中jni和cpp包的区别
- ios - 使被调用的 VC 可以访问调用 ViewController
- docker - 如何在本地运行一次性 Docker 容器(从容器内触发)
- javascript - 如何从数组中删除重复点?