如何使用 django-filters 对基于 class 的列表视图进行分页
How to paginate a class-based list view with django-filters
你们知道如何对使用 django-filters 作为搜索栏的基于 class 的通用 ListView 进行分页吗?当我阅读一些关于这个问题的文章时(对于基于 class 的视图来说并不多),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
。此外,此 class 继承自 MultipleObjectMixin
,因此它能够执行分页,因此如果您在 class 上设置 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')
你们知道如何对使用 django-filters 作为搜索栏的基于 class 的通用 ListView 进行分页吗?当我阅读一些关于这个问题的文章时(对于基于 class 的视图来说并不多),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
。此外,此 class 继承自 MultipleObjectMixin
,因此它能够执行分页,因此如果您在 class 上设置 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')