这是我的网址:
url(r'^test/$|test/(\d+)', views.test_page)
所以在django runserver被解雇后我可以输入127.0.0.1:8000/test/或 相同的网址后跟一个“页面”编号。
以下是我的观点的简化版本:
def test_page(request, pagenumber):
paginator = Paginator(Test.objects.all(), 5)
page = 1
if pagenumber:
page = pagenumber
posts = paginator.page(page)
虽然有效,但效率低下。所以我将其修改为:
def test_page(request, page=1):
paginator = Paginator(Test.objects.all(), 5)
posts = paginator.page(page)
哪个更好,当我在网址中指定页码但有效时 我只输入127.0.0.1:8000/test/它没有。我得到了:
Exception Type: TypeError
Exception Value: int() argument must be a string or a number,
not 'NoneType'
Exception Location: /usr/lib/python2.7/site-packages/django/core/
paginator.py in validate_number, line 23
为什么当我不这样做时,属性页面没有采用默认值1 指定任何页码?
答案 0 :(得分:2)
对于页码等内容,最好使用GET参数,即/test/?page=1
格式。您可以通过request.GET.get('page')
直接在视图中执行此操作,因此urlconf只是r'^test/$
。
答案 1 :(得分:0)
检查代码中的函数参数page
是否为None
。如果将值设置为1.而不是依靠函数来默认它。
答案 2 :(得分:0)
我从未见过以这种方式写过的网址。
你可以试试这样的事情: 要传递一个命名参数,我认为你必须在你的urls.py中指定参数name,它现在看起来不像你那样。
(?P<page>\d+)/$
这是django建议传递defualt参数的方式。 https://docs.djangoproject.com/en/dev/topics/http/urls/#notes-on-capturing-text-in-urls
答案 3 :(得分:0)
我会试试这个:
def test_page(request, **kwargs):
page = kwargs.get('pagenumber', 1)
paginator = Paginator(Test.objects.all(), 5)
posts = paginator.page(page)
没有shell,所以我无法测试此代码。
答案 4 :(得分:0)
请不要尝试为函数调用中传递的参数“page”分配默认值。保持原样:
def test_page(request, page):
请尝试一下,并将网址写为:
url(r'^test/(?P<page>\d+)/$', views.test_page)