Django:如何为以下内容编写反向函数
下面是网址配置和视图的内容:
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)。我试过用 reverse('registration.views.register', kwargs={'success_url':'/test/' }),但是好像不太管用。我已经尝试了好几个小时,还是搞不明白怎么才能正确实现。谢谢!
2 个回答
0
编辑: 抱歉,我完全误解了问题 - 我没有查看函数的定义。实际上,这里出现的问题是你的URL配置设计得让成功的URL无法动态设置。它必须通过extra_context
字典显式传递给函数 - 也就是你目前定义backend
的那个地方。因为在URL本身没有地方可以接受这个参数,所以它必须在代码中写死。
1
如果你想在使用 reverse() 时能够指定参数,这些参数必须在网址配置中定义(使用正则表达式)。比如说:
url(r'^register/(?P<success_url>[\w\/]+)/$',
register,
{ 'backend': 'registration.backends.default.DefaultBackend' },
name='registration_register'),
你可以把网址部分用 ()? 包裹起来,这样就可以让它变成可选的(这样也能匹配简单的注册网址/)。
args 和 kwargs 的区别在于,使用 args 时你可以指定未命名或命名的网址参数,而使用 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 参数,如果你想能够匹配 任何 完整的相对网址,包括相对网址中可能存在的 GET 参数,实际的正则表达式可能会变得相当复杂。
比如说(未经测试):
r'^register/(?P<success_url>[\w\/]+(((\?)([a-zA-Z]*=\w*)){1}((&)([a-zA-Z]*=\w*))*)?)/$'