Django分页从?page =到/ page /

时间:2017-04-21 14:00:41

标签: django

我有这个观点:

class PageView(ListView):
    # ... code ...
    paginate_by = 4

在模板中我有类似的东西:

<div class="pagination">
          <span class="page-links">
              {% if page_obj.has_previous %}
                  <a href="{{ request.path }}?page={{ page_obj.previous_page_number }}">previous</a>
              {% endif %}
              <span class="page-current">
                  Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
              </span>
              {% if page_obj.has_next %}
                  <a href="{{ request.path }}?page={{ page_obj.next_page_number }}">next</a>
              {% endif %}
          </span>
        </div>

如何在django中将GET变量?page=number转换为/page/number/

3 个答案:

答案 0 :(得分:1)

我现在无法测试,但您应该可以重复使用display_array($myArr); 的全部内容。

查看ListView

django.views.generic.list.MultipleObjectMixin#paginate_queryset

这意味着Django首先在视图def paginate_queryset(self, queryset, page_size): """ Paginate the queryset, if needed. """ paginator = self.get_paginator( queryset, page_size, orphans=self.get_paginate_orphans(), allow_empty_first_page=self.get_allow_empty()) page_kwarg = self.page_kwarg # HERE page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1 try: page_number = int(page) except ValueError: if page == 'last': page_number = paginator.num_pages else: raise Http404(_("Page is not 'last', nor can it be converted to an int.")) try: page = paginator.page(page_number) return (paginator, page, page.object_list, page.has_other_pages()) except InvalidPage as e: raise Http404(_('Invalid page (%(page_number)s): %(message)s') % { 'page_number': page_number, 'message': str(e) }) 中查找页码,然后在kwargs参数中查找页码。

get中的值来自视图自己的self.kwargs - 请参阅**kwargs。这意味着您应该只能定义django.views.generic.base.View#as_view之类的网址并将其与现有的CBV一起使用 - 它应该自己选择页码。

答案 1 :(得分:0)

例如,您可以使用视图功能:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def listOfSomethinView(request, page):
    paginator(Something.objects.all(), 10)
    try:
        list_of_something = paginator.page(page)
    except PageNotAnInteger:
        list_of_something = paginator.page(1)
    except EmptyPage:
        list_of_something = paginator.page(paginator.num_pages)

    return render(request, 'path_to_your_template', {
        'list_of_something': list_of_something,
    })
在urls.py中

添加:

url(r'^event/(?P<page>[0-9]{1,10})/$', views.listOfSomethingView, name='listOfSomething')
模板中的

使用类似这样的内容

{% url 'app:listOfSomething' paginator.previous_page_number %}

答案 2 :(得分:0)

行。我解决了 实际上当我有:

url(r'^events/(?P<page>[0-9]+)/$', views.PageView.as_view(), name='events'),

由于page参数丢失且urls.py无法知道/events/路径,因此会引发错误。

所以,在我的网址映射(urls.py)中我写过:

url(r'^events/$', views.PageView.as_view(), name='events'),
url(r'^events/(?P<page>[a-z0-9]+)/$', views.PageView.as_view(), name='events'),

当我转到/events/时,不需要参数,page设置为1,因为没有提供page_kwarg,一切都很好。

当我转到/events/<page>/时,接受该变量,最后它正在工作。

修改:我添加了[a-z0-9]而不是[0-9],因为访问/events/last/时需要它。在url模板标记中,我必须提供last字符串:{% url 'events' 'last' %}

感谢您的回答,如果您认为我的解决方案不好,请在我的回答下面发表评论。

对不起我的语法。