我发现了许多与此问题类似的问题。 This question是其中之一,但是它并不能解决我的问题,因此我将问自己一个问题。
我正在网站上设置密码重设页面。但是,当我进入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的编写方式有问题。
我尝试过:
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'),
]
我的自己 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
的 own 模板来解决此错误,在其中我将行:{% url 'password_reset_confirm' uidb64=uid token=token %}
修改为{% url 'users:password_reset_confirm' uidb64=uid token=token %}
。现在,我几乎可以肯定,我只是在写错误的url或正则表达式。
我已编辑问题以显示新代码。
答案 0 :(得分:0)
我终于明白了。 这是问题的答案。
现在我得到一个ConnectionRefusedError
,这意味着我现在只需要为电子邮件设置一个SMTP服务器,然后它就可以工作了!我一直想念的是,我没有指出要使用的电子邮件模板。我只是将电子邮件模板设置为 the 模板,所以Django无法正确呈现它。这是urls.py
的更新代码,其中path(r'password-reset/')
已更改:
from django.urls import path, reverse_lazy
import django.contrib.auth.views as auth_views
from . import views
urlpatterns = [
# Login Page.
path(r'login/', auth_views.LoginView.as_view(
template_name='users/login.html'
),
name='login'),
# Logout Page.
path(r'logout/', views.logout_view, name='logout'),
# Registration Page.
path(r'register/', views.register, name='register'),
# Password reset page.
path(r'password-reset/', auth_views.PasswordResetView.as_view(
email_template_name='users/password_reset_email.html',
success_url=reverse_lazy('users:password_reset_done')
), name='password_reset'),
# Password reset done page.
path(r'password-reset/done/',
auth_views.PasswordResetDoneView.as_view(),
name='password_reset_done'),
# Password reset confirm page.
path(r'password-reset/confirm/<uidb64>/<token>/',
auth_views.PasswordResetConfirmView.as_view(),
name='password_reset_confirm')
]
其他所有都是正确的。 我从this answer得到了答案。