【问题标题】:Django paginator with many pages具有许多页面的 Django 分页器
【发布时间】:2016-12-29 13:15:54
【问题描述】:

我已经使用通用 ListView 实现了分页器。我的问题是,对于包含许多页面的列表,它会显示所有页码,而不是当前页面之前和之后的五页。有没有简单的方法来解决这个问题?

在views.py中:

class CarList(LoginRequiredMixin, ListView):
model = Car
paginate_by = 20

在html中:

{% if is_paginated %}
        <ul class="pagination pagination-centered">
            {% if page_obj.has_previous %}
                <li><a href="/car?ordering={{ current_order }}&page=1"><<</a></li>
                <li><a href="/car?ordering={{ current_order }}&page={{ page_obj.previous_page_number }}"><</a></li>
            {% endif %}

            {% for i in paginator.page_range %}
            <li {% if page_obj.number == i %} class="active" {% endif %}><a href="/car?ordering={{ current_order }}&page={{i}}">{{i}}</a></li>
            {% endfor %}

            {% if page_obj.has_next %}
                <li><a href="/car?ordering={{ current_order }}&page={{ page_obj.next_page_number }}">></a></li>
                <li><a href="/car?ordering={{ current_order }}&page={{ page_obj.paginator.num_pages }}">>></a></li>
            {% endif %}
        </ul>
{% endif %}

【问题讨论】:

    标签: python django python-3.x pagination django-views


    【解决方案1】:

    算法并不太复杂,如果我们假设如果有超过 11 个页面(当前、5 个之前、5 个之后)我们总是要显示 11 个链接,则可以进一步简化。现在我们有 4 个案例:

    1. 页数
    2. 当前页
    3. 当前页 > 6 和
    4. 当前页 >=(页数 -6):显示最后 11 页。

    考虑到上述情况,让我们修改您的视图,创建一个变量来保存要显示的页面数并将其放入上下文中:

    class CarList(LoginRequiredMixin, ListView):
        model = Car
        paginate_by = 20
    
        def get_context_data(self, **kwargs):
            context = super(CarList, self).get_context_data(**kwargs)
            if not context.get('is_paginated', False):
                return context
    
            paginator = context.get('paginator')
            num_pages = paginator.num_pages
            current_page = context.get('page_obj')
            page_no = current_page.number
    
            if num_pages <= 11 or page_no <= 6:  # case 1 and 2
                pages = [x for x in range(1, min(num_pages + 1, 12))]
            elif page_no > num_pages - 6:  # case 4
                pages = [x for x in range(num_pages - 10, num_pages + 1)]
            else:  # case 3
                pages = [x for x in range(page_no - 5, page_no + 6)]
    
            context.update({'pages': pages})
            return context
    

    现在您可以简单地使用模板中的新变量来创建页面链接:

                (...)
                {% for i in pages %}
                <li {% if page_obj.number == i %} class="active" {% endif %}><a href="/car?ordering={{ current_order }}&page={{i}}">{{i}}</a></li>
                {% endfor %}
                (...)
    

    【讨论】:

    • 谢谢!如果 elif page > num_pages - 6: # case 4 更改为 if elif page_no > num_pages - 6: # case 4 则有效
    • 啊,是的,我的错,编辑了我的答案以纠正错误。
    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多