django-filter 使用分页

新手上路,请多包涵

我正在使用 django-filter 包在我的列表视图中提供搜索功能。

现在我也想为该视图添加分页。

我正在尝试将分页与过滤查询集相结合,但我不知道如何继续。

到目前为止,我已经在 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})

原文由 Anh Tuan Nguyen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

要使用 Django Filter 并对过滤结果进行分页,您可以执行以下操作:

  1. 为您的模型创建一个过滤器类:

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', ...]

  1. 每个 FilterSet 对象都有一个 .qs 包含 过滤 查询集的属性, 如果需要,您甚至可以覆盖它

  2. 我们将对我们的 MyModelFilter.qs 属性进行分页:

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 过滤器 与 Django Rest Framework 一起“玩”得更好

PS_2: 如果您打算使用 DRF,我已经编写了一个示例,说明如何在基于函数的视图中使用分页,您可以轻松地将其与 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)

原文由 John Moutafis 发布,翻译遵循 CC BY-SA 4.0 许可协议

这对我有用:

在我的模板中而不是使用它

<li><a href="?page={{ i }}">{{ i }}</a></li>

我写了这个:

 {% if 'whatever_parameter_you_use_to_filter' in request.get_full_path %}
   <li><a href="{{ request.get_full_path }}&page={{ i }}"{{ i }}</a></li>
{% else %}
   <li><a href="?page={{ i }}">{{ i }}</a></li>
{% endif %}

我希望它有所帮助 :)

原文由 stathoula 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏