我有这样的看法:
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>如何将GET变量?page=number转换成django中的/page/number/?
发布于 2017-04-21 14:22:55
我现在不能测试它,但是您应该能够重用所有的ListView。
看看django.views.generic.list.MultipleObjectMixin#paginate_queryset
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一起使用--它应该自己选择页面编号。
发布于 2017-04-21 14:08:04
例如,您可以使用视图函数:
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 %}发布于 2017-04-21 15:52:40
好的。我解决了。实际上,当我有:
url(r'^events/(?P<page>[0-9]+)/$', views.PageView.as_view(), name='events'),它会引发一个错误,因为缺少page参数,而且urls.py不知道/events/路径。
因此,在我的url映射(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]而不是[0-9],因为当您访问/events/last/时它是必需的。在url模板标记中,我必须以字符串形式提供last:{% url 'events' 'last' %}
谢谢你的回答,如果你认为我的解决方案不好,请在下面评论我的答案。
对不起我的语法。
https://stackoverflow.com/questions/43544701
复制相似问题