2016-07-06 4 views
0

Я новичок в Django, и я пытаюсь добавить аутентификацию пользователя в простое приложение. Я работаю с Django 1.9, и я стараюсь сделать это как можно проще. Вход и выход из системы, но с «Change Password», я получаю ошибку NoReverseMatch для password_change_done.django password_change noreversematch

С моего urls.py

app_name = 'league' 
urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url('^', include('django.contrib.auth.urls')), 
] 

В /league/templates/league/index.html, у меня есть:

<a href="{% url 'league:login' %}">Login</a> 
<a href="{% url 'league:logout' %}">Logout</a> 
<a href="{% url 'league:password_change' %}">Change Password</a> 
<a href="{% url 'league:password_change_done' %}">Change Password Done</a> 

Я создал эти файлы в/лиге/шаблоны/регистрация/, password_change_form.html и password_change_done.html ничего не делают, они содержат только строку, которая отображается.

  • login.html
  • logged_out.html
  • password_change_form.html
  • password_change_done.html

Когда я нажимаю на "Изменить пароль" ссылку, я получаю:

NoReverseMatch at /league/password_change/ 
Reverse for 'password_change_done' with arguments'()' and keyword arguments '{}' not found. 

Я знаю, что ссылка «Сменить пароль» была удалена но я добавил его, чтобы посмотреть, что произойдет. Он работает нормально. Когда я нажимаю его, отображается пароль_change_done.html, как и ожидалось.

Вот трассировки стека с момента, когда я нажимаю на «Изменить пароль» ссылка:

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/league/password_change/ 

Django Version: 1.9.2 
Python Version: 3.4.3 
Installed Applications: 
['league.apps.LeagueConfig', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles'] 
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.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response 
    149.      response = self.process_exception_by_middleware(e, request) 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response 
    147.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/views/decorators/debug.py" in sensitive_post_parameters_wrapper 
    76.    return view(request, *args, **kwargs) 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapped_view 
    149.      response = view_func(request, *args, **kwargs) 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    23.     return view_func(request, *args, **kwargs) 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/contrib/auth/views.py" in inner 
    49.   return func(*args, **kwargs) 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/contrib/auth/views.py" in password_change 
    308.   post_change_redirect = reverse('password_change_done') 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/core/urlresolvers.py" in reverse 
    600.  return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))) 

File "/home/mriley/.virtualenvs/django1_8/lib/python3.4/site-packages/django/core/urlresolvers.py" in _reverse_with_prefix 
    508.        (lookup_view_s, args, kwargs, len(patterns), patterns)) 

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

я нашел подобные случаи на StackOverflow, в том числе this one.

Я изменил свое urls.py к этому:

url(r'^password_change/$', 
    auth_views.password_change, 
    {'current_app': 'league'}, 
    name='password_change'), 
url(r'^password_change_done/$', 
    auth_views.password_change_done, 
    {'current_app': 'league'}, 
    name='password_change_done'), 

Но это не имело никакого значения, я все равно получаю ошибку NoReverseMatch.

Любые идеи, что я делаю неправильно с помощью «Сменить пароль»?

Спасибо, Майк

ответ

0

password_change вид does not use параметр current_app для определения URL перенаправления. Вы должны явно передать имя вида, включая пространство имен:

url(r'^password_change/$', 
    auth_views.password_change, 
    {'post_change_redirect': 'league:password_change_done'}, 
    name='password_change'), 

Параметр current_app используется только в {% url %} тег в шаблоне, но это deprecated и будут удалены в Django 2.0. Если вам нужно текущее приложение в контексте шаблона, вам нужно установить request.current_app.

+0

Это привело меня к работе, спасибо! Я добавил объявление URL для password_change_done, и он отлично работал. – Mike