升级 Django 和 NoReverseMatch 密码错误

Posted

技术标签:

【中文标题】升级 Django 和 NoReverseMatch 密码错误【英文标题】:Upgrade Django and NoReverseMatch password Error 【发布时间】:2015-12-14 01:36:33 【问题描述】:

我正在尝试将旧版本 Django 1.5 升级到更新版本。 升级后,当我进入密码重置页面时,Django 给我错误:

TypeError at /accounts/password/reset/

password_reset() 得到了一个意外的关键字参数“post_change_redirect”

请求方法:GET 类型错误请求 URL:http://localhost:8000/accounts/password/reset/ Django 版本:1.6.11 异常类型:TypeError 异常值:

password_reseteset() 得到了一个意外的关键字参数“post_change_redirect”

异常位置:/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/utils/decorators.py 在 _wrapped_view,第 99 行 Python 可执行文件:/home/martin/Work/wisepress.com/virtualenv/bin/python Python 版本:2.7.8

--

追溯: get_response 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/core/handlers/base.py” 112.响应=wrapped_callback(请求,*callback_args,**callback_kwargs) passwd_reset 中的文件“/home/martin/Work/wisepress.com/eshopwisepress/wp_auth/views.py” 109. return password_reset(request, *args, **kwargs) _wrapped_view 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/utils/decorators.py” 99. 响应 = view_func(请求,*args,**kwargs) password_reset 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/contrib/auth/views.py” 142. post_reset_redirect = 反向('password_reset_done') 反向文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/core/urlresolvers.py” 536. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)) _reverse_with_prefix 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/core/urlresolvers.py” 456. (lookup_view_s, args, kwargs, len(patterns), patterns))

异常类型:NoReverseMatch at /accounts/password/reset/ 异常值:未找到带有参数“()”和关键字参数“”的“password_reset_done”的反向。尝试了 0 个模式:[]

在 urls.py 我有:

      url(r'^password/reset/done/$', 'django.contrib.auth.views.password_reset_done', name='passwd_reset_done'),
      url(r'^password/reset/confirm/(?P<uidb36>\w+)/(?P<token>[\d\w-]+)/$', 'django.contrib.auth.views.password_reset_confirm_uidb36', name='passwd_reset_confirm'),
      url(r'^password/reset/completed/$', 'django.contrib.auth.views.password_reset_complete', name='passwd_reset_complete'),
      url(r'^password/reset/$', passwd_reset, 'template_name':'emailing/registration-activation/password_reset_email.html', name='password_reset'),

在views.py中我有:

from django.contrib.auth.views import password_reset

def passwd_reset(request, *args, **kwargs):
    kwargs['password_reset_form'] = PasswdResetForm
    kwargs['email_template_name'] = 'emailing/registration-activation/password_reset_email.html'
    kwargs['from_email'] = FROM_EMAIL
    return password_reset(request, *args, **kwargs)

在 Django 1.5 中它工作正常,但在较新的版本中给我错误。 你知道任何人如何解决它? 谢谢

编辑: 我在 urls.py 中更改了一些用于重置密码的 url。现在在那里:

    url(r'^password/reset/done/$', 'django.contrib.auth.views.password_reset_done', name='password_reset_done'),
    url(r'^password/reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm', name='password_reset_confirm'),
    url(r'^password/reset/completed/$', 'django.contrib.auth.views.password_reset_complete', name='password_reset_complete'),
    url(r'^password/reset/$', passwd_reset, 'template_name':'emailing/registration-activation/password_reset_email.html', name='password_reset'),

现在我有错误:

模板错误: 在模板 /home/martin/Work/wisepress.com/eshopwisepress/templates/emailing/registration-activation/password_reset_email.html 中,第 44 行出错

> 没有找到带有参数 '()' 和关键字参数 'u'uidb64': '', u'token': ''' 的 'django.contrib.auth.views.password_reset_confirm' 的反向操作。尝试了 1 种模式:['accounts/password/reset/confirm/(?P\w+)/(?P[\d\w-]+)/$']

第 44 行现在是:

<a href=" protocol :// site_name  % url 'django.contrib.auth.views.password_reset_confirm' uidb64=uid token=token % " target="_blank" style="color: #68b58e; text-decoration: none; font-style: italic;">Reset password</a><br/><br/>

--

追溯: get_response 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/core/handlers/base.py” 137. 响应 = response.render() 渲染中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/template/response.py” 105. self.content = self.rendered_content 渲染内容中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/template/response.py” 82. 内容 = 模板. 渲染(上下文) 渲染中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/template/base.py” 140.返回self._render(上下文) _render 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/template/base.py” 134.返回self.nodelist.render(上下文) 渲染中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/template/base.py” 840.bit = self.render_node(节点,上下文) render_node 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/template/debug.py” 78. 返回节点.render(context) 渲染中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/template/defaulttags.py” 447. 六.reraise(*exc_info) 渲染中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/template/defaulttags.py” 433. url = 反向(view_name,args=args,kwargs=kwargs,current_app=context.current_app) 反向文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/core/urlresolvers.py” 536. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)) _reverse_with_prefix 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/core/urlresolvers.py” 456.(lookup_view_s,args,kwargs,len(模式),模式))

异常类型:NoReverseMatch at /accounts/password/reset/ 异常值:'django.contrib.auth.views.password_reset_confirm' 与参数'()' 和关键字参数'u'uidb64': '', u'token': ''' 的相反。尝试了 1 种模式:['accounts/password/reset/confirm/(?P\w+)/(?P[\d\w-]+)/$']

【问题讨论】:

你能发布整个回溯吗? 回溯:get_response 112 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/core/handlers/base.py” . response = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件 "/home/martin/Work/wisepress.com/eshopwisepress/wp_auth/views.py" in passwd_reset 109. return password_reset(request, *args, **kwargs ) _wrapped_view 99 中的文件“/home/martin/Work/wisepress.com/virtualenv/local/lib/python2.7/site-packages/django/utils/decorators.py”。 response = view_func(request, *args, * *kwargs) 最好编辑问题并在那里添加回溯,这样您就可以很好地格式化它。我对错误消息感到困惑,因为post_change_redirect 仅用于password_change 方法。您是否在urls.py 中使用password_changepassword_change_done 视图?此外,最好使用与Django uses 相同的网址名称,例如name='password_reset_done' 而不是name='passwd_reset_done' 以更好的格式回溯:pastebin.com/n9hFgFxy 非常感谢,现在我将 template_name 更改为 email_template_name,现在它可以工作了 :-) 【参考方案1】:

在您的 password_reset 网址格式中,template_name 不应与您的 email_template_name 相同。 template_name 是一个向用户显示密码重置表单的模板。

【讨论】:

以上是关于升级 Django 和 NoReverseMatch 密码错误的主要内容,如果未能解决你的问题,请参考以下文章

升级 Django 和 allauth 在 /accounts/profile/ 返回 KeyError

makemigrations 和升级到 Django 1.7 的问题

Django实现自动发布(3发布-升级和回退)

Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台

Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台

升级到 Django 1.11 后 append_slash 不再起作用