如何在Django分页器中使用get_elided_page_range?

n6lpvg4x  于 2022-12-30  发布在  Go
关注(0)|答案(2)|浏览(440)

There is new option to create pagination range - get_elided_page_range https://docs.djangoproject.com/en/3.2/ref/paginator/#django.core.paginator.Paginator.get_elided_page_range
我应该如何使用它?我如何设置参数?我正在使用CBV列表视图。我尝试了https://nemecek.be/blog/105/how-to-use-elided-pagination-in-django-and-solve-too-many-pages-problem,但它不适合我。
我有81页,当前页是10页。问题是我总是有范围1 2 3 4 ... 80 81我做错了什么?
浏览次数. py

class TrailersListView(ListView):
    queryset = Trailer.objects.all()
    paginate_by = 10

模板. html

{% for i in paginator.get_elided_page_range %}
    {% if page_obj.number == i %}
        <li class="active page-item">
            <span class="page-link">{{ i }}</span>
        </li>
    {% else %}
        {% if i == paginator.ELLIPSIS %}
            <li class="page-item">
                <span class="page-link">{{ paginator.ELLIPSIS }}</span>
            </li>
        {% else %}
            <li class="page-item">
                <a class="page-link" href="?page={{ i }}">{{ i }}</a>
            </li>
        {% endif %}
    {% endif %}
{% endfor %}
cnjp1d6j

cnjp1d6j1#

页码没有传递给“get_elided_page_range”方法,它一直使用默认值(1),所以我创建了一个自定义标记来传递一个数字。

应用程序名称/模板标签/分页器标签.py

from django import template
from django.core.paginator import Paginator

register = template.Library()

@register.simple_tag
def get_proper_elided_page_range(p, number, on_each_side=3, on_ends=2):
    paginator = Paginator(p.object_list, p.per_page)
    return paginator.get_elided_page_range(number=number, 
                                           on_each_side=on_each_side,
                                           on_ends=on_ends)

模板.html

{% load paginator_tags %}

{% get_proper_elided_page_range paginator page_obj.number as page_range %} <!-- here -->
{% for page_num in page_range %}
    {% if page_obj.number == i %}
        <li class="active page-item">
            <span class="page-link">{{ i }}</span>
        </li>
    {% else %}
        {% if i == paginator.ELLIPSIS %}
            <li class="page-item">
                <span class="page-link">{{ paginator.ELLIPSIS }}</span>
            </li>
        {% else %}
            <li class="page-item">
                <a class="page-link" href="?page={{ i }}">{{ i }}</a>
            </li>
        {% endif %}
    {% endif %}
{% endfor %}

您可以添加其他参数,例如:
第一个月

8hhllhi2

8hhllhi22#

如果您使用的是基于类的视图,如问题示例中的ListView,那么如果您通过设置paginate_by成员触发分页,则get_context_data方法中提供了page_obj对象。通过此方法,您可以在Paginator上调用get_elided_page_range,以便为正在呈现的模板设置额外的上下文。
示例:

def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        page: Page = context['page_obj']
        context['paginator_range'] = page.paginator.get_elided_page_range(page.number)
        return context

然后可以从模板中访问paginator_range
用法说明:此方法返回一个生成器,该生成器生成int(有效页码)或str(...)(无效页码)。

相关问题