Django:如何为以下内容编写反向函数

1 投票
2 回答
1631 浏览
提问于 2025-04-15 23:39

下面是网址配置和视图的内容:

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'),

你可以把网址部分用 ()? 包裹起来,这样就可以让它变成可选的(这样也能匹配简单的注册网址/)。
argskwargs 的区别在于,使用 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*))*)?)/$'

撰写回答