Джанго: Как написать обратную функцию для следующего - PullRequest
1 голос
/ 07 июня 2010

urlconf и view выглядят следующим образом:

url(r'^register/$',
    register,
    { 'backend': 'registration.backends.default.DefaultBackend' },
    name='registration_register'),



def register(request, backend, success_url=None, form_class=None,
             disallowed_url='registration_disallowed',
             template_name='registration/registration_form.html',
             extra_context=None):

Я хочу перенаправить пользователей на страницу регистрации и указать success_url.Я попытался вернуться ('registration.views.register', kwargs = {'success_url': '/ test /'}), но это не сработало.Я пытался часами и не могу понять, как это сделать правильно.Спасибо

Ответы [ 2 ]

1 голос
/ 07 июня 2010

Если вы хотите иметь возможность указать reverse () с параметрами, эти параметры должны быть определены в самой конфигурации URL (regexp).Примерно так:

url(r'^register/(?P<success_url>[\w\/]+)/$',
    register,
    { 'backend': 'registration.backends.default.DefaultBackend' },
    name='registration_register'),

Вы можете заключить этот раздел URL в ()? , чтобы сделать его необязательным (чтобы он совпадал с простым регистром / тоже). Разница между args и kwargs заключается в том, что с помощью аргументов можно указывать неназванные / именованные параметры URL, а с kwargs только именованными.Итак:

r'^register/(?P<success_url>\w+)/$'
reverse('url_name', args=[my_success_url])
reverse('url_name', kwargs={'success_url': my_success_url}) // both work and do the same

r'^register/(\w+)/$'
reverse('url_name', args=[my_success_url]) // only this works

Редактировать : Для параметров success_url, если вы хотите иметь возможность сопоставлять любой полный относительный URL, включая возможные параметры GET в относительном URLФактическое регулярное выражение может быть довольно сложным.Что-то вроде (не проверено):

r'^register/(?P<success_url>[\w\/]+(((\?)([a-zA-Z]*=\w*)){1}((&)([a-zA-Z]*=\w*))*)?)/$'
0 голосов
/ 07 июня 2010

Редактировать : Извините, полностью неправильно прочитал вопрос - я не смотрел определение функции. На самом деле проблема здесь в том, что ваш URLconf разработан таким образом, что делает невозможным динамическую установку success_url. Он должен быть явно передан функции через словарь extra_context, т. Е. Тот, в котором вы в настоящее время определили backend. Поскольку в самом URL-адресе нет ничего, что могло бы принять этот параметр, его необходимо жестко запрограммировать.

...