我正在遵循Adding a password reset feature中有关Django Admin的部分,该部分要求您添加以下四个路径:
path('admin/password_reset/', auth_views.PasswordResetView.as_view(), name='admin_password_reset'),
path('admin/password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
添加它们时,“忘记了密码或用户名?”链接出现在Django Admin登录屏幕上,如果单击它,它可以工作,甚至可以发送电子邮件,但是在收到电子邮件后,我最终遇到此错误。
Page not found (404)
Request Method: GET
Request URL: http://localhost:8000/accounts/password_reset/done/
Raised by: django.contrib.auth.views.PasswordResetDoneView
404 ...嗯...是的...那不是password_reset/done
所在的地方。电子邮件中的链接用于:http://localhost:8000/accounts/reset/Mjk/5...9
,因此,反对的地方不是reset/<uidb64>/<token>/
。为什么这些网址放在错误的位置/accounts/
而不是/admin/
。
我的完整网址格式如下:
urlpatterns = [
path('admin/password_reset/', auth_views.PasswordResetView.as_view(), name='admin_password_reset'),
path('admin/password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
path('admin/', admin.site.urls),
path('accounts/', include('django.contrib.auth.urls')),
path("", views.index, name="homepage")
]
我猜是因为这些/accounts/
,这些重定向转到了path('accounts/', include('django.contrib.auth.urls'))
,对吗?还有其他控制方式吗?我主要是想了解发生了什么。
答案 0 :(得分:1)
要发送包含另一个URL的密码重置电子邮件,我相信您需要添加一个单独的电子邮件模板。为此,您需要创建一个链接到该模板的不同视图。您可以通过子类化Django的auth视图来使用它们,并仅定义需要不同的设置。
以下是一般创建自定义密码重置视图的方法,该视图可与默认视图一起使用:
# urls.py
from .views import CustomPasswordResetView
urlpatterns = [
...
# URL to submit your email address for reset link
path('admin/password-reset', CustomPasswordResetView.as_view(), name='custom_password_reset'),
# URL link in email, lands on password reset form
path('admin/reset/<uidb64>/<token>/', CustomPasswordResetConfirmView.as_view(), name='custom_password_reset_confirm'),
...
]
# views.py
from django.contrib.auth.views import PasswordResetView
class CustomPasswordResetView(PasswordResetView):
email_template_name = 'registration/custom_password_reset_email.html'
默认情况下,Django在django/contrib/admin/templates/registration/password_reset_email.html
中使用密码重置电子邮件模板。也有与密码重置有关的默认HTML模板。
要指定自己的模板,请在项目模板的某个位置(例如registration
)创建另一个users/templates/registration/
目录,并在此处创建文件。请确保为它指定与Django默认模板不同的名称,例如{ {1}},然后将默认电子邮件文本复制并粘贴到其中,然后将命名URL更改为所需的URL,即registration/custom_password_reset_email.html
。
您可以子类化其他相关视图({% 'custom_password_reset_confirm' %}
,PasswordChange
等),以根据需要覆盖其他默认设置,例如HTML模板,表单类和重定向URL。所有密码重置视图都位于django.contrib.auth.views
中。 auth视图以基于类的视图的形式提供(与较早的基于标准函数的视图(从Django 2.1版开始删除)一起)。