如何在 django 中为上下文对象执行分页?

Posted

技术标签:

【中文标题】如何在 django 中为上下文对象执行分页?【英文标题】:How to perform pagination for context object in django? 【发布时间】:2019-03-02 02:03:54 【问题描述】:

我在views.py中尝试过这样的事情:

class HomePage(TemplateView):
     template_name = "clouderp/index.html"

    def get_context_data(self, **kwargs):
        context = super(HomePage, self).get_context_data(**kwargs) 
        qs = Blog.objects.all()
        context['blog_list'] = qs

        page = self.request.GET.get('page')

        paginator = Paginator(qs, 4)

        try:
            users = paginator.page(page)
        except PageNotAnInteger:
            users = paginator.page(1)
        except EmptyPage:
            users = paginator.page(paginator.num_pages)

        context['users'] = users

        return context

在模板中:

% if users.has_other_pages %
<ul class="pagination">
  % if users.has_previous %
    <li><a href="?page= users.previous_page_number ">&laquo;</a></li>
  % else %
    <li class="disabled"><span>&laquo;</span></li>
  % endif %
  % for i in users.paginator.page_range %
    % if users.number == i %
      <li class="active"><span> i  <span class="sr-only"></span></span></li>
    % else %
      <li><a href="?page= i "> i </a></li>
    % endif %
  % endfor %
  % if users.has_next %
    <li><a href="?page= users.next_page_number ">&raquo;</a></li>
  % else %
    <li class="disabled"><span>&raquo;</span></li>
  % endif %
</ul>
% endif %

我使用 django 创建了一个博客应用程序 我想在我的 index.html 主页面中显示我的所有博客,并且还想为我的索引页面中的博客进行分页... 我想知道该怎么做... 因为我做博客的过程不是一次按4分页的...

【问题讨论】:

使用ListView 代替TemplateView 可能更简单,因为ListView 已经有分页选项。 context['blog_list'] = qs 所以在你的模板中 blog_list 没有分页。 users 是分页的(为什么blog_list 的页面还是叫users?)。 【参考方案1】:

请尝试以下代码: 在views.py 代码中

    class BookListView(ListView):
    model=Book
    paginate_by=10
    template_name='book/book_list.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        print (context)
        paginator = context['paginator']
        page_numbers_range = 10  # Display 5 page numbers
        max_index = len(paginator.page_range)

        page = self.request.GET.get('page')
        print (self.request)
        current_page = int(page) if page else 1

        start_index = int((current_page - 1) / page_numbers_range) * page_numbers_range
        end_index = start_index + page_numbers_range
        if end_index >= max_index:
            end_index = max_index

        page_range = paginator.page_range[start_index:end_index]
        context['page_range'] = page_range
        return context

book_list = BookListView.as_view()

和模板:

<div class="container">
            <!-- Pagination -->
            % if is_paginated %
            <nav>
                <ul class="pagination justify-content-center" style="margin:20px 0">
                % if page_obj.has_previous %
                    <li class="page-item">
                    <a class="page-link" href="?page= page_obj.previous_page_number ">
                        <span>Prev</span>
                    </a>
                    </li>
                % else %
                    <li class="disabled page-item">
                    <a class="page-link" href="#">
                        <span>Prev</span>
                    </a>
                    </li>
                % endif %

                % for page in page_range %
                    <li % if page == page_obj.number % class="active page-item" % endif %>
                    <a class="page-link" href="?page= page "> page </a>
                    </li>
                % endfor %
                % if page_obj.has_next %
                    <li class="page-item">
                    <a class="page-link" href="?page= page_obj.next_page_number ">
                        <span>Next</span>
                    </a>
                    </li>
                % else %
                    <li % if not page_obj.has_next %class="disabled page-item"% endif %>
                    <a class="page-link" href="#">
                        <span>Next</span>
                    </a>
                    </li>
                % endif %
                </ul>
            </nav>
            % endif %
    </div>

【讨论】:

以上是关于如何在 django 中为上下文对象执行分页?的主要内容,如果未能解决你的问题,请参考以下文章

ListView中多个上下文中特定上下文的分页在django中不起作用?

您将如何在 django 中设置“上下文”类型的对象

如何在 Core Data 中为多个对象(相同实体类型)生成数组实例?

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

如何在 Twig 中为 KNP 分页器获取分页方向?

如何在 django 模板中为循环创建唯一的 javascript 变量名?