Django:如何编写以下的反向函数

时间:2010-06-07 11:21:03

标签: python django reverse url kwargs

urlconf和视图如下:

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 个答案:

答案 0 :(得分:1)

如果您希望能够使用参数指定 reverse(),则必须在URL配置本身(regexp)中定义这些参数。类似的东西:

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

您可以将该网址部分包装在()?中以使其可选(因此它只匹配简单的寄存器/) args kwargs 之间的区别在于,使用args,您可以指定未命名/命名的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 params,如果您希望能够匹配任何完整的相对URL,包括相对URL中可能的GET参数,则实际的正则表达式可能会非常复杂。 像(未经测试)的东西:

r'^register/(?P<success_url>[\w\/]+(((\?)([a-zA-Z]*=\w*)){1}((&)([a-zA-Z]*=\w*))*)?)/$'

答案 1 :(得分:0)

编辑:抱歉,完全误读了这个问题 - 我没有看到函数定义。实际上,这里的问题是你的URLconf的设计方式使得无法动态设置success_url。它必须通过extra_context字典显式传递给函数 - 即您当前定义的字典backend。由于URL本身没有任何内容可以接受此参数,因此必须对其进行硬编码。