如何使用Django对django-filter过滤的查询进行分页?

时间:2017-08-22 20:59:28

标签: python django pagination django-filter

我一直在使用django-filter app来过滤模型。当我尝试使用Django的paginator时,从过滤后的查询中分页,它不起作用。虽然页码位于底部,但所有结果都放在一页上。当我点击不同的页码时,结果在放到一个页面时未经过滤。

有没有人知道这方面的解决方案?

views.py

from .models import Video
from django.shortcuts import render
from .filters import VideoFilter
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


def search(request):
    video_list = Video.objects.all()
    video_filter = VideoFilter(request.POST, queryset=video_list)
    paginator = Paginator(video_filter.qs, 1)
    page = request.GET.get('page')
    try:
        videos = paginator.page(page)
    except PageNotAnInteger:
        videos = paginator.page(1)
    except EmptyPage:
        videos = paginator.page(paginator.num_pages)

    return render(request, 'search/user_list.html', {'filter': video_filter,'videos':videos})

搜索/ user_list.html

{% extends 'base.html' %}

{% block content %}
  <form method="post">{% csrf_token %}
    {{ filter.form.as_p }}
    <button type="submit">Search</button>
  </form>
  <ul>
  {% for video in filter.qs %}
    <li>{{ video.title }}</li>
  {% endfor %}
  </ul>

  {% if videos.has_other_pages %}
    <ul class="pagination">
      {% if videos.has_previous %}
        <li><a href="?page={{ videos.previous_page_number }}">&laquo;</a></li>
      {% else %}
        <li class="disabled"><span>&laquo;</span></li>
      {% endif %}
      {% for i in videos.paginator.page_range %}
        {% if videos.number == i %}
          <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
        {% else %}
          <li><a href="?page={{ i }}">{{ i }}</a></li>
        {% endif %}
      {% endfor %}
      {% if videos.has_next %}
        <li><a href="?page={{ videos.next_page_number }}">&raquo;</a></li>
      {% else %}
        <li class="disabled"><span>&raquo;</span></li>
      {% endif %}
    </ul>
  {% endif %}
{% endblock %}

1 个答案:

答案 0 :(得分:0)

您需要遍历分页器的object_list而不是过滤器的.qs属性。

{% for video in videos.object_list %}
    <li>{{ video.title }}</li>
{% endfor %}