【问题标题】:Django Pagination based on Boolean value from viewDjango分页基于视图中的布尔值
【发布时间】:2016-03-20 22:00:06
【问题描述】:

我是 Django 新手,并尝试根据 URL 中的不同值设置分页。

在views.py中

class PageListView(ListView):
    model = FbPage
    paginate_by = 50

    all_pages = False

    def dispatch(self, *args, **kwargs):
        self.request.session['all_pages'] = self.all_pages
        return super(PageListView, self).dispatch(*args, **kwargs)

在网址中:

    url(r'^$', PageListView.as_view(), name='show_page_list'),
    url(r'^all/$', PageListView.as_view(all_pages=True), name='all_show_page_list'),

在模板中:

        <div class="pagination">

        <span class="page-links">
            {% if page_obj.has_previous %}

                    <a href="{% url 'show_page_list' %}?page={{ page_obj.previous_page_number }}">previous</a>
            {% endif %}
            <span class="page-current">
                Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }} (total {{ page_obj.paginator.count }} items).
            </span>
            {% if page_obj.has_next %}
                <a href="{% url 'show_page_list' %}?page={{ page_obj.next_page_number }}">next</a>
            {% endif %}
        </span>
    </div>

问题是,即使我在home/all 页面中,它也会链接回home 页面分页,因为我传递的是show_page_list 而不是all_show_page_list

如何在模板中设置 if else 以便我可以有正确的分页或者我应该做一些不同的事情?

【问题讨论】:

  • 您可能想阅读一下。它很好地分解了 ListView。 ccbv.co.uk/projects/Django/1.9/django.views.generic.list/…
  • 显示“全部”可能会使您的页面加载持续变慢,因为您的数据库中包含更多对象。我建议使用按 5、10、25、50 或类似页面分页的“亚马逊”方法。
  • 您可以查看我的分页器。它是原始的,但它有效并且具有良好的逻辑。 github.com/mrvol/uni_paginator
  • 感谢 EmettSpeer 和 mrvol 的好意。我一定会调查这些。目前我仍处于学习阶段,所以我想自己实现它以了解更多信息。说我会注意的。这是个好主意。我可以在 Django 中使用内置分页器吗?

标签: python django pagination


【解决方案1】:

您可以在上下文变量中定义您的模式名称并将其传递给{% url %} 标签:

<div>
   <div class="pagination">

    <span class="page-links">
        {% if page_obj.has_previous %}

                <a href="{% url list_url %}?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}
        <span class="page-current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }} (total {{ page_obj.paginator.count }} items).
        </span>
        {% if page_obj.has_next %}
            <a href="{% url list_url %}?page={{ page_obj.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

在你看来:

class PageListView(ListView):
    model = FbPage
    paginate_by = 50

    all_pages = False

    def dispatch(self, *args, **kwargs):
        self.request.session['all_pages'] = self.all_pages
        return super(PageListView, self).dispatch(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(PageListView, self).get_context_data(**kwargs)

        context['list_url'] = 'all_show_page_list' if self.all_pages else 'show_page_list'

        return context

【讨论】:

  • 谢谢。它完美地工作。我确实对Reverse for 'list_url' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: [] 有问题,但这可能与我的 django 版本有关,而不是您的代码,因为它在我的开发机器上完美运行,但在部署服务器中却没有
  • 我真的很想知道为什么它在 Django 1.7.1python 2.7.6 中有效但在 python 2.7.9 中失败
  • 将变量作为 url 名称放入 {% url %} 标记可从 django 1.5 获得,如果您在服务器上使用 1.4(并且您可能会这样做),它将无法正常工作。
  • 我发现我必须重新启动服务器。一旦我这样做了,它就开始正常工作了。再次感谢您。
猜你喜欢
  • 2017-05-08
  • 2014-10-12
  • 1970-01-01
  • 2015-04-27
  • 2010-10-14
  • 1970-01-01
  • 2020-02-28
  • 2019-09-24
  • 1970-01-01
相关资源
最近更新 更多