Django default password_change больше не работает?

django django-authentication

186 просмотра

1 ответ

Я пытаюсь использовать djangoвстроенные авторские представления для добавления change passwordфункции.

Я создаю приложение с именем «пользователи» и настраиваю, urls.pyкак показано ниже:

from django.conf.urls import url
from django.contrib.auth.views import login, logout, password_change, password_change_done

from .views import SignUpView


app_name = 'users'
urlpatterns = [
    url(r'^signup/$', SignUpView.as_view(), name='signup'),
    url(r'^login/$', login, name='login', kwargs={'template_name': 'users/login.html'}),
    url(r'^logout/$', logout, name='logout', kwargs={'next_page': '/'}),
    url(
        r'^password_change/$',
        password_change,
        name='password_change',
        kwargs={
            'template_name': 'users/password_change_form.html',
            'current_app':'users'
        }
    ),
    url(
        r'^password_change/done$',
        password_change_done,
        name='password_change_done',
        kwargs={
            'template_name': 'users/password_change_done.html',
            'current_app':'users'
        }
    ),
]

И я также создать users/password_change_form.html, users/password_change_done.htmlтоже.

Но возникает ошибка:

[20/Aug/2016 13:55:00] "GET /accounts/password_change/ HTTP/1.1" 500 106496
Internal Server Error: /accounts/password_change/
Traceback (most recent call last):
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/views/decorators/debug.py", line 76, in sensitive_post_parameters_wrapper
    return view(request, *args, **kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/utils/decorators.py", line 149, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/contrib/auth/views.py", line 49, in inner
    return func(*args, **kwargs)
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/contrib/auth/views.py", line 308, in password_change
    post_change_redirect = reverse('password_change_done')
  File "/Users/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/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/Chois/.pyenv/versions/chacha_dabang/lib/python3.5/site-packages/django/core/urlresolvers.py", line 508, in _reverse_with_prefix
    (lookup_view_s, args, kwargs, len(patterns), patterns))
django.core.urlresolvers.NoReverseMatch: Reverse for 'password_change_done' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

Нужна ваша помощь. Спасибо:)

Автор: user3595632 Источник Размещён: 08.11.2019 10:54

Ответы (1)


3 плюса

Проблема в том, что вы указали app_nameв верхней части вашего URL конфигурации. Это означает, что все URL-адреса, которые вы определяете, имеют пространство имен с этим app_name. Таким образом, окончательное имя для вашего URL-адреса выполнено смена пароля, users:password_change_doneа не password_change_done. Вот почему обратный поиск не удается.

Вы можете исправить это, передав post_change_redirectkwarg в password_changeпредставление:

from django.core.urlresolvers import reverse

url(
    r'^password_change/$',
    password_change,
    name='password_change',
    kwargs={
        'template_name': 'users/password_change_form.html',
        'current_app':'users',
        'post_change_redirect': reverse_lazy('users:password_change_done')
    }
),

Также обратите внимание, что этот current_appаргумент устарел с Django 1.9:

current_appПараметр является устаревшим и будет удален в Django 2.0. Абоненты должны установить request.current_appвместо.

Автор: solarissmoke Размещён: 20.08.2016 05:45
Вопросы из категории :
32x32