将属性传递给视图,默认属性不起作用

时间:2012-02-07 13:23:09

标签: django django-views

这是我的网址:

  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 指定任何页码?

5 个答案:

答案 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)