【问题标题】:Django Tags results pagination not working as I expectedDjango 标签结果分页没有按我的预期工作
【发布时间】:2016-01-27 15:42:34
【问题描述】:

我正在尝试对从标签返回的结果进行分页,但它无法正常工作。如果我有三个帖子,分页器将有三个结果页面,如果我有两个帖子,分页器将有两个结果页面。我有多少帖子这就是分页器将有多少页。如果我使用分页器从数据库返回正常结果,分页器就可以工作。我所做的是复制它并尝试修改它以适应标签分页。但它没有像我预期的那样工作。我还将分页放在一个包含文件中,试图保持干燥,但我不确定这是否是我的问题,这是我的代码。

分页.html:

<div class="text-center" style="margin-bottom: 20px">
<ul class="pagination">
{% if queryset.has_previous %}
    <li><a href="?page=1"><<</a></li>
    <li><a href="?{{ page_request_var }}={{ queryset.previous_page_number }}
{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">prev</a></li>
{% endif %}


{% for i in paginator.page_range %}

 <li {% if page_obj.number == i %} class="active" {% endif %}><a href="?page={{i}}">{{i}}</a><li>
<!--Page {{ queryset.number }} of {{ queryset.paginator.num_pages }}.-->

{% endfor %}


{% if queryset.has_next %}
    <li><a href="?{{ page_request_var }}={{ queryset.next_page_number }}
    {% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">next</a></li>
    <li><a href="?page={{ queryset.paginator.num_pages }}">>></a></li>
{% endif %}
</ul>

这个分页不能按我想要的方式工作,views.py:

def tag_list(request, slug=None):
instance = get_object_or_404(Tag, slug=slug)
ins = instance.post_set.all()

query = request.GET.get("q")
if query:
    ins = ins.filter(
            Q(title__icontains=query) |
            Q(content__icontains=query) |
            Q(user__first_name__icontains=query) |
            Q(user__last_name__icontains=query)
    ).distinct()

paginator = Paginator(ins, 1)
page_request_var = "page"
page = request.GET.get(page_request_var)
try:
    queryset = paginator.page(page)
except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    queryset = paginator.page(1)
except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    queryset = paginator.page(paginator.num_pages)

context = {
    "instance": ins,
    "queryset": queryset,
    "paginator": paginator,

}
return render(request, "posts/tag_list.html", context)

以下是我复制分页的地方。这个有效

def post_list(request):
today = timezone.now().date()
queryset_list = Post.objects.active()
if request.user.is_staff or request.user.is_superuser:
    queryset_list = Post.objects.all()

query = request.GET.get("q")
if query:
    queryset_list = queryset_list.filter(
            Q(title__icontains=query) |
            Q(content__icontains=query) |
            Q(user__first_name__icontains=query) |
            Q(user__last_name__icontains=query)
    ).distinct()
paginator = Paginator(queryset_list, 6)  # Show 25 contacts per page
page_request_var = "page"
page = request.GET.get(page_request_var)
try:
    queryset = paginator.page(page)
except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    queryset = paginator.page(1)
except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    queryset = paginator.page(paginator.num_pages)
context = {
        "queryset": queryset,
        "title": "Posts",
        "page_request_var": page_request_var,
        "today": today,
        "queryset_list": queryset_list,
        "paginator": paginator,
    }

return render(request, "posts/post_list.html", context)

【问题讨论】:

  • 什么不起作用?我不清楚实际问题是什么
  • @Sayse 标签分页。当我单击一个标签时,我希望将用户发送到 tags_list.html,它将显示具有相同标签的所有帖子。如果我每页只能显示四个并且有十六个结果,我希望在分页器中显示四个页面

标签: python django pagination


【解决方案1】:

分页器的第二个参数是每页显示多少个结果,目前您将其设置为一个,根据您的评论,您可能希望这是 4

paginator = Paginator(ins, 1)

应该是

paginator = Paginator(ins, 4)

您也永远不会将page_request_var 传递回模板,这意味着它永远不会找到正确的页面,然后返回相同的页面

context = {
    "instance": ins,
    "queryset": queryset,
    "paginator": paginator,
    "page_request_var": page_request_var
}

【讨论】:

  • 这只有在我使用没有标签的情况下才有效。正常的方式。当我使用标签进行操作时,它不起作用。如果我有五个帖子并制作这样的分页器, paginator = Paginator(ins, 1) 我应该有五个页面,每个页面都有不同的结果,但我得到了 5\5 个页面,结果相同
  • 我的帖子有标签。例如,如果我单击“操作”,所有具有操作标记的帖子都将显示在我的 tags_list.html 页面中。如果我点击“喜剧”,所有喜剧都会出现等
  • @losee - 查看我上次更新的回复:缺少上下文变量,如果不是这样,我不确定是什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2021-01-31
  • 2020-08-04
  • 2012-04-25
  • 1970-01-01
  • 2021-09-23
  • 2013-09-02
相关资源
最近更新 更多