Я нашел много похожих вопросов к этой проблеме. Этот вопрос был одним из них, но он не решил мою проблему, поэтому я задам свой вопрос.
Я делаю страницу сброса пароля на моем сайте.Но когда я захожу на http://localhost:8000/users/reset-password
и ввожу свою электронную почту и нажимаю «Сбросить мой пароль», Django выдает мне ошибку NoReverseMatch
.Ошибка:
NoReverseMatch at /users/reset-password/
Reverse for 'password_reset_confirm' not found. 'password_reset_confirm' is not a valid view function or pattern name.
Я полагаю, что что-то не так с тем, как я пишу свои urlpatterns.
Я пробовал:
- Создание собственных представлений иШаблоны.
- Переписать все мои urlpatterns.
Мой код
urls.py :
"""Defines URL Patterns for users."""
from django.urls import re_path
from django.contrib.auth.views import (
LoginView, PasswordResetView, PasswordResetConfirmView,
PasswordResetDoneView,
)
from . import views
urlpatterns = [
# Login Page.
re_path(r'^login/$', LoginView.as_view(template_name='users/login.html'),
name='login'),
# Logout Page.
re_path(r'^logout/$', views.logout_view, name='logout'),
# Registration Page.
re_path(r'^register/$', views.register, name='register'),
# Password reset Page.
re_path(r'^password_reset/$', PasswordResetView.as_view(
# This is the only line I added in this file.
template_name='users/password_reset_email.html'
),
name='password_reset'),
# Password reset done Page.
re_path(r'^password_reset/done/$', PasswordResetDoneView.as_view(),
name='password_reset_done'),
# Password reset confirm Page.
re_path(r'^password_reset/confirm/'
+ '(?P<uidb64>[0-9A-Za-z]+)/(?P<token>.+)/$',
PasswordResetConfirmView.as_view(),
name='password_reset_confirm'),
]
My собственный users/password_reset_email.html
:
{% load i18n %}{% autoescape off %}
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}
{% trans "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'users:password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}
{% trans "Thanks for using our site!" %}
{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
{% endautoescape %}
Обновление:
Я понял что-то правильно.Теперь я получаю NoReverseMatch at /users/password_reset/
Reverse for 'password_reset_confirm' with keyword arguments '{'uidb64': '', 'token': ''}' not found. 1 pattern(s) tried: ['users/password_reset/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$']
.Я попал в эту ошибку, используя свой собственный шаблон djangos password_reset_email.html
, где я изменил строку: {% url 'password_reset_confirm' uidb64=uid token=token %}
до {% url 'users:password_reset_confirm' uidb64=uid token=token %}
.Теперь я почти уверен, что просто неправильно пишу свои URL или регулярные выражения.
Я отредактировал свой вопрос, чтобы показать новый код.