Передача атрибута в представление, атрибут по умолчанию не работает - PullRequest
0 голосов
/ 07 февраля 2012

Вот мой URL:

  url(r'^test/$|test/(\d+)', views.test_page)

Таким образом, при запущенном сервере запуска django я могу ввести 127.0.0.1:8000/test/ или тот же URL, за которым следует номер страницы.

Вот упрощенная версия моего взгляда:

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)

Что лучше, работает, когда я указываю номер страницы в URL, но когда я просто ввожу 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 ]

2 голосов
/ 07 февраля 2012

Для таких вещей, как номера страниц, лучше использовать параметры GET, то есть форму /test/?page=1.Вы делаете это непосредственно в представлении через request.GET.get('page'), поэтому urlconf просто r'^test/$.

0 голосов
/ 07 февраля 2012

Пожалуйста, не пытайтесь назначить значение по умолчанию для аргумента "страница", который вы передаете в вызове функции.Просто сохраните его как:

def test_page(request, page):

Пожалуйста, попробуйте и напишите URL как:

url(r'^test/(?P<page>\d+)/$', views.test_page)
0 голосов
/ 07 февраля 2012

Я никогда не видел записи URL, написанной таким образом.

Не могли бы вы попробовать что-то вроде: Чтобы передать именованный аргумент, я думаю, что вы должны указать это имя аргумента в вашем urls.py, похоже, что вы делаете это сейчас.

(?P<page>\d+)/$ именно так django рекомендует передавать аргументы по умолчанию. https://docs.djangoproject.com/en/dev/topics/http/urls/#notes-on-capturing-text-in-urls

0 голосов
/ 07 февраля 2012

Я бы попробовал это:

def test_page(request, **kwargs):
    page = kwargs.get('pagenumber', 1)
    paginator = Paginator(Test.objects.all(), 5)
    posts = paginator.page(page)

Нет оболочки, поэтому я не смог протестировать этот код.

0 голосов
/ 07 февраля 2012

Проверьте, есть ли в коде параметр функции page None.Если установлено значение 1. Вместо того, чтобы полагаться на функцию по умолчанию.

...