Django:重定向后保留捕获的参数

时间:2013-10-19 23:59:28

标签: django url redirect view capture

我在使用网址和视图之间的互动方面遇到了一些麻烦。在我的项目中,我有重定向和双重定向,并且它们工作正常,但是当我尝试恢复正则表达式捕获的参数时,目标视图抱怨它没有接收任何参数。这是我的实施:

项目/ urls.py:

lang_re = r'(ca|en|es|fr|ge)'

urlpatterns = patterns('',
    url(r'^$', RedirectView.as_view(url='/en/home/')),
    url(r'^'+lang_re+'/home/', include('components.home.urls', namespace='components.home')),
    ...
)

组件/家/ urls.py:

urlpatterns = patterns('',
    url(r'^$', RedirectView.as_view(url='cover')),
    url(r'^cover$', views.cover, name='home_cover'),
    ...
)

组件/家/ views.py

def cover(request, lang_code):
    ...

这里发生的事情,例如,当一个人进入根目录时,会被重定向到“/ en / home”。这匹配第二个正则表达式(并且它应该捕获“en”部分作为参数),之后用户通过相对重定向再次重定向到“/ en / home / cover”。最后一个URL最终找到一个永久视图“components.home.views.cover”,并运行其功能。问题是重定向后捕获的参数(“en”)似乎丢失了,Django给了我以下错误信息:

Request Method: GET
Request URL: http://localhost:8000/en/home/cover
Django Version: 1.5.2
Exception Type: TypeError
Exception Value: cover() missing 1 required positional argument: 'lang_code'

关于如何组合重定向和捕获的参数的任何线索?

1 个答案:

答案 0 :(得分:2)

您正面临该问题,因为在您的正则表达式中,您没有named argument与视图方法匹配。

现在解决此问题:

lang_re = '(ca|en|es|fr|ge)'
url(r'^(?P<lang_code>'+lang_re+')/home/', include('components.home.urls', namespace='components.home')),

详细了解argument name matches of regex here

注意:正则表达式周围不需要r''