将密码重置添加到Django Admin会导致URL错误?

时间:2018-12-20 10:29:06

标签: django

我正在遵循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')),对吗?还有其他控制方式吗?我主要是想了解发生了什么。

1 个答案:

答案 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版开始删除)一起)。