如何使用 django-filters 对基于类的列表视图进行分页

问题描述

你们知道如何对使用 django 过滤器作为搜索栏的基于类的通用 ListView 进行分页吗?当我阅读一些关于这个问题的文章时(对于基于类的视图来说并不是很多),似乎 django-filters 和分页不能很好地协同工作。这是我的观点:

class StudentListView(OrganisorAndLoginrequiredMixin,generic.ListView):
    template_name = "leads/student_list.html"
    context_object_name = "leads"

    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        context['filter'] = StudentFilter(self.request.GET,queryset=self.get_queryset())
        return context

    def get_queryset(self):
        organisation = self.request.user.userprofile
        return Lead.objects.filter(organisation=organisation).order_by('first_name')

如果你们能告诉我我需要为我的视图编写哪些代码以及我需要将哪些代码添加到我的模板中以使分页工作,我将不胜感激。我不认为实际过滤器和模板的代码是必要的,但是如果你们需要它,我可以将它添加到这个问题中。谢谢。

有关其他信息,我将在模板中添加以下分页代码

{% if is_paginated %}
  <div class="pagination">
      <span class="page-links">
          {% if page_obj.has_prevIoUs %}
              <a href="{{ request.path }}?page={{ page_obj.prevIoUs_page_number }}">prevIoUs</a>
          {% endif %}
          <span class="page-current">
              Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
          </span>
          {% if page_obj.has_next %}
              <a href="{{ request.path }}?page={{ page_obj.next_page_number }}">next</a>
          {% endif %}
      </span>
  </div>
{% endif %}

解决方法

您应该使用 django-filter 提供的 FilterView。此类也继承自 MultipleObjectMixin,因此它能够执行分页,因此如果您在该类上设置 paginate_by 属性,它也会执行分页:

from django_filters.views import FilterView


class StudentListView(OrganisorAndLoginRequiredMixin,FilterView):
    template_name = "leads/student_list.html"
    context_object_name = "leads"
    filterset_class = StudentFilter
    paginate_by = 10 # Change as per your preference
    
    def get_queryset(self):
        organisation = self.request.user.userprofile
        return Lead.objects.filter(organisation=organisation).order_by('first_name')

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...