我在模板中使用Django分页器.它可以工作,但当页面很多时就不太好了.

views.py:

def blog(request):
    blogs_list = Blog.objects.all()

    paginator = Paginator(blogs_list, 1)

    try:
        page = int(request.GET.get('page', '1'))
    except:
        page = 1

    try:
        blogs = paginator.page(page)
    except(EmptyPage, InvalidPage):
        blogs = paginator.page(page)
    return render(request, 'blogs.html', {
        'blogs':blogs
        })

模板的代码片断:

  <div class="prev_next">

    {% if blogs.has_previous %}
      <a class="prev btn btn-info" href="?page={{blogs.previous_page_number}}">Prev</a>
    {% endif %}
    {% if blogs.has_next %}
      <a class="next btn btn-info" href="?page={{blogs.next_page_number}}">Next</a>
    {% endif %}
    <div class="pages">
      <ul>
      {% for pg in blogs.paginator.page_range %}
        {% if blogs.number == pg %}
          <li><a href="?page={{pg}}" class="btn btn-default">{{pg}}</a></li>
        {% else %}
          <li><a href="?page={{pg}}" class="btn">{{pg}}</a></li>
        {% endif %}
      {% endfor %}
      </ul>
    </div>
    <span class="clear_both"></span>

  </div> 

现在看起来是这样的:

在此处输入图像描述

我该怎么做才能只显示7个页码,而不是所有页码都在当前页码范围内,比如:

Prev 1 (2) 3 4 5 Next

我希望我讲得很清楚,如果没有的话,请问我.我们将非常感谢您的帮助和指导.谢谢.

推荐答案

首先,我要更改以下内容:

try:
    blogs = paginator.page(page)
except(EmptyPage, InvalidPage):
    blogs = paginator.page(page)  # Raises the same error

但是你可以在你的上下文中通过一个范围.

index = paginator.page_range.index(blogs.number)
max_index = len(paginator.page_range)
start_index = index - 3 if index >= 3 else 0
end_index = index + 3 if index <= max_index - 3 else max_index
page_range = paginator.page_range[start_index:end_index]

现在,你应该能够在这个范围内循环,用?page=来构建正确的链接.

===编辑===

def blog(request):
    paginator = Paginator(Blog.objects.all(), 1)

    try:
        page = int(request.GET.get('page', '1'))
    except:
        page = 1

    try:
        blogs = paginator.page(page)
    except(EmptyPage, InvalidPage):
        blogs = paginator.page(1)

    # Get the index of the current page
    index = blogs.number - 1  # edited to something easier without index
    # This value is maximum index of your pages, so the last page - 1
    max_index = len(paginator.page_range)
    # You want a range of 7, so lets calculate where to slice the list
    start_index = index - 3 if index >= 3 else 0
    end_index = index + 3 if index <= max_index - 3 else max_index
    # Get our new page range. In the latest versions of Django page_range returns 
    # an iterator. Thus pass it to list, to make our slice possible again.
    page_range = list(paginator.page_range)[start_index:end_index]

    return render(request, 'blogs.html', {
        'blogs': blogs,
        'page_range': page_range,
    })

因此,现在我们必须编辑您的模板以接受新的页码列表:

<div class="prev_next">
    {% if blogs.has_previous %}
        <a class="prev btn btn-info" href="?page={{blogs.previous_page_number}}">Prev</a>
    {% endif %}
    {% if blogs.has_next %}
        <a class="next btn btn-info" href="?page={{blogs.next_page_number}}">Next</a>
    {% endif %}
    <div class="pages">
        <ul>
        {% for pg in page_range %}
            {% if blogs.number == pg %}
                <li><a href="?page={{pg}}" class="btn btn-default">{{pg}}</a></li>
            {% else %}
                <li><a href="?page={{pg}}" class="btn">{{pg}}</a></li>
            {% endif %}
        {% endfor %}
        </ul>
    </div>
    <span class="clear_both"></span>
</div>

Django相关问答推荐

如何在对接合成时创建两个Postgres数据库?

如何在Django REST框架中使用FactoryBoy创建不同的项目

DjangoAdmin与外部数据库的模型无法保存或过滤

SQLite上可以正常使用Many2Many链接注释,但MariaDB上无法正常使用(生产环境)

如果字段为空,则 Unique_together 不起作用.怎么约束呢?

如何使用邮箱确认码创建django注册

如何使用具有某些权限的 Django 组的转储数据和加载数据?

重建 Dockerfile 后,Django celery 无法从celery导入名称Celery

Django 和 HTML 无法从指定时间开始视频

是否可以在没有模型的情况下创建自定义管理视图

可插拔应用程序的Django默认设置约定?

可以在 github 页面上托管 django 站点吗?

Django 存储匿名用户数据

如何使用基于类的视图处理表单(通过 get 或 post)?

从基于类的通用视图中获取 request.session

更改 Django ModelChoiceField 以显示用户的全名而不是用户名

Jinja2中的多级模板继承?

Django admin:使字段在添加中可编辑但不可编辑

django.db.utils.OperationalError 无法连接到服务器

Django 中的自定义 HTTP 标头