Django反向使用kwargs

时间:2015-10-16 15:15:49

标签: django django-urls

比如说,在我的注册类的post方法中,如果用户已经注册,我想将用户重定向到登录页面,这很简单。

class Register(View):
    ...
    def post(self, request):
        # Some code to check if the email address is already in the db
        message = {'message': 'You are already a member and registered the project.  Please just log-in',
                   'registration_date': the_registered_date}# The form with the filled-in data is returned
        return HttpResponseRedirect(reverse('accounts:login', kwargs = message))

在我的urls.py中:

#urls.py
...
url(r'^login/{0,1}$', Login.as_view(), name='login', kwargs={'message': None, 'date': None}),

这给了我错误信息:

Reverse for 'login' with arguments '()' and keyword arguments '{'message': 'You are already a member and registered the project.  Please just log-in', 'registration_date': datetime.datetime(2015, 10, 15, 14, 3, 39, 864000, tzinfo=<UTC>)}' not found. 2 pattern(s) tried: [u'accounts/$', u'accounts/login/{0,1}$']

我做错了什么?

2 个答案:

答案 0 :(得分:5)

您的网址定义错误,听起来像是您误解kwargs reverse中的内容。它将您的网址定义的命名参数与其值相关联,而不是将上下文传递给视图。

例如,你可以这样做:

url(r'test_suite/(?P<test_name>\w+)/(?P<test_id>\d+)$', 'test', name='test')
reverse('test', kwargs={'test_name': 'haha', 'test_id': 1})

kwargs会将您test_name的网址定义替换为haha,将test_id替换为1。这将产生一个网址:test_suite/haha/1

答案 1 :(得分:1)

reverse中的Kwargs是进入您的网址以使其唯一的变量。在URL中查看消息/日期真是奇怪......这是您的URLconf尝试做的事情。

此外,你不能在Django中使用上下文重定向而不会遇到麻烦,这会让果汁不值得挤压。一种选择是使用messages framework在登录页面上显示消息,如果您想在重定向后执行此操作。

我的解决方案是从URLConf中删除kwargs for / login /并使用消息框架(或sessions)在重定向后将信息传递到登录页面。