【问题标题】:Django reverse using kwargsDjango 使用 kwargs 反向
【发布时间】:2016-01-15 09:51:57
【问题描述】:

说,在我的注册类的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}$']

我做错了什么?

【问题讨论】:

  • 这看起来不对:^login/{0,1}$

标签: django django-urls


【解决方案1】:

您的 url 定义是错误的,听起来您也误解了 kwargsreverse 中所做的事情。它用它的值提供你的 url 定义的命名参数,而不是将上下文传递给视图。

例如,您可以这样做:

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 会将您在 url 定义中的 test_name 替换为 hahatest_id 替换为 1。这将产生一个 url:test_suite/haha/1

【讨论】:

    【解决方案2】:

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

    另外,你不能在 Django 中使用上下文重定向而不去麻烦,这使得果汁不值得挤压。如果您想在重定向后这样做,一种选择是使用messages framework 在登录页面上显示一条消息。

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

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2014-01-12
      • 1970-01-01
      • 2015-01-09
      • 2011-07-12
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多