【问题标题】:Reverse for 'password_change_done' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []未找到带有参数“()”和关键字参数“{}”的“password_change_done”的反向操作。尝试了 0 种模式:[]
【发布时间】:2017-05-04 00:40:09
【问题描述】:

我在 Django 中收到以下错误。未找到带有参数“()”和关键字参数“{}”的“password_change_done”的反向操作。尝试了 0 个模式:[]。我不确定为什么会收到此错误。

urls.py

from django.conf.urls import url
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    url(r'^login/$', auth_views.login, name='login'),
    url(r'^logout/$', auth_views.logout, name='logout'),
    url(r'^logout-then-login/$', auth_views.logout_then_login, name="logout_then_login"),
    url(r'^$', views.dashboard, name='dashboard'),

    #change password urls
    url(r'^password-change/$', auth_views.password_change, name='password_change'),
    url(r'^password-change/done/$', auth_views.password_change_done, name='password_change_done'),
]

追溯: 环境:

Request Method: GET
Request URL: http://127.0.0.1:8000/account/password-change/

Django Version: 1.10.4
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'whitenoise',
 'crispy_forms',
 'business',
 'account']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/views/decorators/debug.py" in sensitive_post_parameters_wrapper
  76.             return view(request, *args, **kwargs)

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/contrib/auth/views.py" in inner
  47.         return func(*args, **kwargs)

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/contrib/auth/views.py" in password_change
  308.         post_change_redirect = reverse('password_change_done')

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/urls/base.py" in reverse
  91.     return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))

File "/Users/Tommy/Desktop/django/directory/lib/python3.5/site-packages/django/urls/resolvers.py" in _reverse_with_prefix
  392.             (lookup_view_s, args, kwargs, len(patterns), patterns)

Exception Type: NoReverseMatch at /account/password-change/
Exception Value: Reverse for 'password_change_done' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

我要打开的页面的html

{% extends "base.html" %}
{% load crispy_forms_tags %}

{% block title %}Change Your Password{% endblock %}

{% block content %}
<div class="offset-md-3 col-md-6">
    <h1>Change Your Password</h1>
    <p>Use the form below to change your password.</p>
    <form action="." method="post">
        {{form|crispy}}
        {% csrf_token %}
    </form>
</div>
{% endblock %}

【问题讨论】:

  • 将您的 URL 名称从 password_change_done 更改为 auth_password_change_done 并继续使用该名称
  • Karthik Ravindra - 试过了但没有用,谢谢。

标签: python django


【解决方案1】:

由于您在应用程序的url.py 中添加了password_change,因此您应该使用post_change_redirect 参数指定包含应用程序名称的post_change url:

url(r'^password-change/$', password_change, {'post_change_redirect': 'account:password_change_done'}, name='password_change'),
url(r'^password-change/done/$', password_change_done, name='password_change_done'),

account 是应用程序 URL 的命名空间。

【讨论】:

  • 仍然没有解决问题。不过感谢您的帮助
  • @TomMyers 你使用什么版本的 Django?顺便说一句,您是否还可以检查项目的url.py 应该是这样的:url(r'^account/', include('account.urls', namespace='account'))。错误还是一样的Reverse for 'password_change_done'?
  • Django 1.10 和项目 urls.py url(r'^account/', include('account.urls', app_name='account', namespace='account')),是的,我是收到相同的反向错误。
  • 哈哈,你第一次是对的。添加您的解决方案时,我有一个错字。所以我们很高兴。非常感谢
【解决方案2】:

问题可能是您的 URL 已命名空间,而您忘记使用命名空间。试试:

{% url 'account:password_change_done' %}

reverse('account:password_change_done')

记得给你的名字命名,否则 django 可能无法找到它们。您可以通过查看包含登录网址等的位置来找到您正在使用的名称空间(如果不是account)。它应该类似于:

url(r'account/', include('account.urls', namespace='account')),

【讨论】:

  • 我还没有在我的模板中设置任何网址。我的主要网址与您上面的相同,但没有运气
  • 如果您正在访问/account/password_change 的页面,正如您的堆栈跟踪所暗示的那样,它不能是您的主 urls 文件。
猜你喜欢
  • 2016-11-21
  • 2014-11-23
  • 2017-01-06
  • 2018-07-12
  • 2016-05-08
  • 2016-08-27
  • 1970-01-01
  • 2016-03-21
  • 2014-01-26
相关资源
最近更新 更多