Параметры по умолчанию для действий с Django - PullRequest
3 голосов
/ 24 октября 2008

Есть ли способ передать параметр по умолчанию в действие в том случае, если регулярное выражение не соответствует чему-либо с использованием django?


urlpatterns = patterns('',(r'^test/(?P<name>.*)?$','myview.displayName'))

#myview.py
def displayName(request,name):
      # write name to response or something

Я попытался установить третий параметр в urlpatterns для словаря, содержащего ', и присвоить параметру name значение по умолчанию для метода, ни один из которых не работал. параметр имени всегда кажется None. Я действительно не хочу кодировать проверку для None, если бы я мог установить значение по умолчанию.

Разъяснение: вот пример того, на что я его изменял.


def displayName(request,name='Steve'):
      return HttpResponse(name)
#i also tried

urlpatterns = patterns('',
      (r'^test/(?P<name>.*)?$',
        'myview.displayName',
        dict(name='Test')
      )
)

когда я указываю браузеру на вид, он отображает текст 'None'

Есть идеи?

Ответы [ 2 ]

9 голосов
/ 24 октября 2008

Проблема заключается в том, что когда шаблон сопоставляется с 'test /', групповой термин, захваченный регулярным выражением, содержит отображение 'name' => None:

>>> url.match("test/").groupdict()
{'name': None}

Это означает, что когда вызывается представление, используется что-то, что, как я ожидаю, похоже на приведенное ниже:

view(request, *groups, **groupdict)

, что эквивалентно:

view(request, name = None)

для 'test /', что означает, что имя назначено Нет, а не присвоено.

Это оставляет вам два варианта. Вы можете:

  1. Явно проверьте None в коде представления, что является своего рода хакером.
  2. Переписать правило отправки URL, чтобы сделать захват имени необязательным, и ввести второе правило для захвата, когда имя не указано.

Например:

urlpatterns = patterns('',
    (r'^test/(?P<name>.+)$','myview.displayName'), # note the '+' instead of the '*'
    (r'^test/$','myview.displayName'),
)

При втором подходе вы можете просто вызвать метод без шаблона перехвата и позволить python обрабатывать параметр по умолчанию, или вы можете вызвать другое представление, которое делегирует.

0 голосов
/ 24 октября 2008

Я думал вы могли бы def displayName(request, name=defaultObj); это то, что я делал в прошлом, по крайней мере. Что вы устанавливали в качестве значения по умолчанию?

...