简体   繁体   English

Django - NoReverseMatch在/ accounts / password_reset /

[英]Django - NoReverseMatch at /accounts/password_reset/

I'm trying to use the built in Django password reset. 我正在尝试使用内置的Django密码重置。 Looking through the Django docs , from what I gather it basically involves just adding a few URL's to urls.py 浏览Django文档 ,从我收集的内容来看,它基本上只需要添加一些URL到urls.py

urls.py : urls.py

urlpatterns = [
    url(r'^login/$', views.login_view, name='login'),
    url(r'^password_reset/$', auth_views.password_reset, {'post_reset_redirect' : '/accounts/password_reset_done/'}, name='password_reset'),
    url(r'^password_reset_done/$', auth_views.password_reset_done, name='password_reset_done'),
    url(r'^password_reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', auth_views.password_reset_confirm, {'post_reset_redirect' : '/accounts/password_done/'}, name='password_reset_confirm'),
    url(r'^password_done/$', auth_views.password_reset_complete, name='password_done'),
    url(r'^auth/$', views.login_auth, name='login_auth'),
    url(r'^register/$', views.register_user, name='register'),
    url(r'^logout/$', views.logout_user, name='logout'),
]

login.html : login.html

{% extends "base.html" %}

{% block content %}

    <title>{% block title %} | Login{% endblock %}</title>

    <form action="/accounts/auth/" method="POST">
        <h2>Login</h2>
        {% if error_message %}<div class="formfielderrors">* {{ error_message }}</div>{% endif %}
        {% csrf_token %}
        <label for="username">Username: </label>
        <br>
        <input type="text" name="username" value="" id="username">
        <br><br>
        <label for="password">Password: </label>
        <br>
        <input type="password" name="password" value="" id="password">
        <br><br>
        <a href="/accounts/password_reset/">Forgot Password?</a>
        <br><br>
        <input type="submit" value="Login" class="greenButton">
    </form>

{% endblock content %}

I'm fairly certain that I've properly added these URL's, and the r'^password_reset/$' page loads properly, but after entering my email and clicking 'Reset my password', I get the following error: 我很确定我已经正确添加了这些URL,并且r'^password_reset/$'页面正确加载,但在输入我的电子邮件并单击“重置我的密码”后,我收到以下错误:

NoReverseMatch at /accounts/password_reset/ NoReverseMatch at / accounts / password_reset /

I'm not totally sure what this error even means, so it's been pretty hard for me to debug. 我不完全确定这个错误甚至意味着什么,所以我很难调试。 From looking through the documentation, this doesn't seem like difficult functionality to implement, but I can't seem to get it working. 从查看文档来看,这似乎不是很难实现的功能,但我似乎无法让它工作。 What am I doing wrong here? 我在这做错了什么?

The full error: 完整的错误:

response = self.process_exception_by_middleware(e, request)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/contrib/auth/views.py", line 49, in inner
    return func(*args, **kwargs)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/utils/decorators.py", line 149, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/contrib/auth/views.py", line 205, in password_reset
    form.save(**opts)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/contrib/auth/forms.py", line 259, in save
    html_email_template_name=html_email_template_name)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/contrib/auth/forms.py", line 208, in send_mail
    body = loader.render_to_string(email_template_name, context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/loader.py", line 97, in render_to_string
    return template.render(context, request)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/backends/django.py", line 95, in render
    return self.template.render(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/base.py", line 206, in render
    return self._render(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/base.py", line 197, in _render
    return self.nodelist.render(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/base.py", line 988, in render
    bit = node.render_annotated(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/base.py", line 955, in render_annotated
    return self.render(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/defaulttags.py", line 41, in render
    output = self.nodelist.render(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/base.py", line 988, in render
    bit = node.render_annotated(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/base.py", line 955, in render_annotated
    return self.render(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/loader_tags.py", line 60, in render
    result = self.nodelist.render(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/base.py", line 988, in render
    bit = node.render_annotated(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/base.py", line 955, in render_annotated
    return self.render(context)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/defaulttags.py", line 513, in render
    six.reraise(*exc_info)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/template/defaulttags.py", line 499, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/core/urlresolvers.py", line 600, in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
  File "/Users/tomeldridge/Desktop/Misc/Hobbies/Programming/Projects/Pygamers/venv/lib/python2.7/site-packages/django/core/urlresolvers.py", line 508, in _reverse_with_prefix
    (lookup_view_s, args, kwargs, len(patterns), patterns))
NoReverseMatch: Reverse for 'password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb64': 'MQ', u'token': u'49h-b07b0dfeb4aa82d09149'}' not found. 0 pattern(s) tried: []
[17/Feb/2016 01:47:33] "POST /accounts/password_reset/ HTTP/1.1" 500 173812

The problem comes from your use of namespace for account urls and Django's built-in template used in the view. 问题来自于您使用帐户网址的命名空间和视图中使用的Django内置模板。 In the template registration/password_reset_email.html you'll see: 在模板registration/password_reset_email.html您将看到:

{% url 'password_reset_confirm' uidb64=uid token=token %}

However, the url name password_reset_confirm doesn't exist in your app because you used the namespace "accounts" - the url became accounts:password_reset_confirm instead. 但是,您的应用中不存在网址名称password_reset_confirm ,因为您使用了命名空间“accounts” - 该网址变为accounts:password_reset_confirm

You might consider creating a separate file to store urls that don't use the "accounts" namespace. 您可以考虑创建一个单独的文件来存储不使用“accounts”命名空间的URL。 Eg 例如

# urls_django_auth.py
url_patterns = [
    url(r'^password_reset/$', auth_views.password_reset, ...),
    url(r'^password_reset_done/$', auth_views.password_reset_done, ...),
    ... other django auth views ...
]

# urls.py
url_patterns = [
    ....
    url(r'^accounts/', include('accounts.urls', namespace='accounts')),
    url(r'^accounts/', include('accounts.urls_django_auth')),  
]

Or you can create your own version of password_reset_email.html with the correct URL pattern, and pass it to your view 或者,您可以使用正确的URL模式创建自己的password_reset_email.html版本,并将其传递给您的视图

url(r'^password_reset/$', auth_views.password_reset, {
    'post_reset_redirect' : '/accounts/password_reset_done/',
    'email_template_name': '/your/own/password_reset_email.html'     
}, name='password_reset')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM