首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从?page=到/page/分页

从?page=到/page/分页
EN

Stack Overflow用户
提问于 2017-04-21 14:00:40
回答 3查看 2.4K关注 0票数 5

我有这样的看法:

代码语言:javascript
复制
class PageView(ListView):
    # ... code ...
    paginate_by = 4

在模板中,我有如下内容:

代码语言:javascript
复制
<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>

如何将GET变量?page=number转换成django中的/page/number/

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-21 14:22:55

我现在不能测试它,但是您应该能够重用所有的ListView

看看django.views.generic.list.MultipleObjectMixin#paginate_queryset

代码语言:javascript
复制
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)
        })

这意味着Django首先在视图的kwargs中查找页面号,然后在get参数中查找。

self.kwargs中的值来自视图自己的**kwargs --参见django.views.generic.base.View#as_view。这意味着您应该能够定义一个像url(r'^event/(?P<page>'d+)/$'这样的URL,并将其与您现有的CBV一起使用--它应该自己选择页面编号。

票数 3
EN

Stack Overflow用户

发布于 2017-04-21 14:08:04

例如,您可以使用视图函数:

代码语言:javascript
复制
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中添加以下内容:

代码语言:javascript
复制
url(r'^event/(?P<page>[0-9]{1,10})/$', views.listOfSomethingView, name='listOfSomething')

在模板中使用如下内容

代码语言:javascript
复制
{% url 'app:listOfSomething' paginator.previous_page_number %}
票数 1
EN

Stack Overflow用户

发布于 2017-04-21 15:52:40

好的。我解决了。实际上,当我有:

代码语言:javascript
复制
url(r'^events/(?P<page>[0-9]+)/$', views.PageView.as_view(), name='events'),

它会引发一个错误,因为缺少page参数,而且urls.py不知道/events/路径。

因此,在我的url映射(urls.py)中,我写了:

代码语言:javascript
复制
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]而不是[0-9],因为当您访问/events/last/时它是必需的。在url模板标记中,我必须以字符串形式提供last{% url 'events' 'last' %}

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

对不起我的语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43544701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档