django - django 分页只显示部分页码

标签 django django-pagination

我在模板中使用 django 分页器。它工作正常,但当有大量页面时效果不佳。

View .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> 

现在它看起来像这样:

enter image description here

我该怎么做才能只显示 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 - django 分页只显示部分页码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30864011/

相关文章:

reactjs - 有没有办法热构建 React 来与 Django 一起使用?

python - 使用 Django 下载 xlsx 格式的 SQL 数据

python - Django 分页 |获取页面索引中分页项目的当前索引(不是页面索引范围本身)

python - Django分页

python - 如何为基于类的 View 创建分页器?

python - Django ATOMIC_REQUESTS 不工作

php - 如何使用基于 HTML 的用户界面表示多对多记录的关系

Django 在 View 中获取静态文件 URL

python - 如何使用 django paginator 在页面上拆分 DataFrame (pandas)?

Django分页(获取对象对应的页码)