Django过滤器使用分页 [英] django-filter use paginations
问题描述
我正在使用 django-filter
包提供搜索功能在我的列表视图中.
I'm using the django-filter
package to provide a search functionality on my List View.
现在我也想在该视图中添加分页.
我正在尝试将分页与过滤后的查询集结合起来,但是我不知道如何继续.
Now I want to add a pagination to that view as well.
I'm trying to combine pagination to a filtered queryset, but I have no clue on how to go on.
到目前为止,我已经在views.py
上尝试过以下方法:
So far, I have tried the following on views.py
:
def search(request):
qs = local_url.objects.filter(global_url__id=1).all()
paginator = Paginator(qs, 25)
page = request.GET.get('page')
try:
pub = paginator.page(page)
except PageNotAnInteger:
pub = paginator.page(1)
except EmptyPage:
pub = paginator.page(paginator.num_pages)
url_filter = PublicationFilter(request.GET, queryset=qs)
return render(request, 'ingester/search_list.html', {'filter': url_filter, 'publication':pub})
推荐答案
要使用Django过滤器并对过滤后的结果进行分页,您可以执行以下操作:
To use Django Filter and paginate the filtered result you can do the following:
-
为模型创建过滤器类:
Create a filter class for your model:
在my_project/my_app/filters.py
上:
import django_filters
class MyModelFilter(django_filters.FilterSet):
class Meta:
model = MyModel
# Declare all your model fields by which you will filter
# your queryset here:
fields = ['field_1', 'field_2', ...]
Every FilterSet
object has a .qs
property which contains the filtered queryset and you can even override it if you want.
我们将对MyModelFilter
的.qs
属性进行分页:
We will paginate the .qs
property of our MyModelFilter
:
在my_project/my_app/views.py
上:
from . import filters
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def my_view(request):
# BTW you do not need .all() after a .filter()
# local_url.objects.filter(global_url__id=1) will do
filtered_qs = filters.MyModelFilter(
request.GET,
queryset=MyModel.objects.all()
).qs
paginator = Paginator(filtered_qs, YOUR_PAGE_SIZE)
page = request.GET.get('page')
try:
response = paginator.page(page)
except PageNotAnInteger:
response = paginator.page(1)
except EmptyPage:
response = paginator.page(paginator.num_pages)
return render(
request,
'your_template.html',
{'response': response}
)
就在那里!
PS_1:根据我的经验,Django过滤器
PS_1: Django filter in my experience, "plays" better with Django Rest Framework.
PS_2:如果您要使用DRF,我已经写了一个示例,说明如何在基于函数的视图中使用分页,您可以轻松地将其与FilterSet
结合使用:
PS_2: If you are about to utilize DRF, I have written an example on how to use pagination in a function based view which you can easily combine with a FilterSet
:
@api_view(['GET',])
def my_function_based_list_view(request):
paginator = PageNumberPagination()
filtered_set = filters.MyModelFilter(
request.GET,
queryset=MyModel.objects.all()
).qs
context = paginator.paginate_queryset(filtered_set, request)
serializer = MyModelSerializer(context, many=True)
return paginator.get_paginated_response(serializer.data)
这篇关于Django过滤器使用分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!