django2.x自定义密码重置页面

最近在使用django的时候,觉得自带的用户密码重置页面和自己的网站风格不太符合,而且我想把这个功能放在我的用户模块user下,然后功能又不想自己完全实现,于是打算自定义页面的模板。
一个方法是修改原来的模板,这种方式当然是不推荐的,另外一种方式就是自定义,让django使用我们的自定义模板,我自定义模板直接放在我用户模块下。
官方网站并没有给出自定义模板的方法,网上找了一圈,大部分都有问题,提示各种错误,最后自己各种尝试,最终实现的方法如下:

1.在user模板文件目录下创建自己的模板文件。
注意,因为我们继承的django原生的,所以里面显示的form,控件等可以参考原来模板内容
password_reset_form.html #重置密码的模板文件
mail_subject.txt #重置密码邮件的标题
password_reset_email.html #重置邮件的邮件内容
password_reset_done.html #重置邮件的
password_reset_confirm.html #用户点了密码重置链接后的页面
password_reset_complete.html #密码重置成功后的页面

2.在用户模块user视图view里自定义视图类,继承对应的django自带密码重置视图类,并设置对应的参数值。主要代码示例如下:
(我自己用户模块user的模板文件目录/user/templates/user/)

from django.contrib.auth.views import PasswordResetView,PasswordResetDoneView,PasswordResetConfirmView,PasswordResetCompleteView
from django.urls import reverse_lazy
class PasswordReset(PasswordResetView):
    template_name='user/password_reset_form.html'
    subject_template_name ='user/mail_subject.txt'
    email_template_name='user/password_reset_email.html'
    success_url = reverse_lazy('user:password_reset_done')

class PasswordResetDone(PasswordResetDoneView):
    template_name='user/password_reset_done.html'

class PasswordResetConfirm(PasswordResetConfirmView):
    template_name='user/password_reset_confirm.html'
    success_url = reverse_lazy('user:password_reset_complete')

class PasswordResetComplete(PasswordResetCompleteView):
    template_name='user/password_reset_complete.html'

注意,网上很多教程就是在继承参数这里有问题,导致url解析失败或者模板找不到等错误,或者有的是建立在重置密码url在根目录的情况。
例如,我的重置密码路径是/user/password_reset/,而很多其他人的教程是基于/password_reset/的,因此他们不需要改success_url之类的参数。

3.修改用户模块user的路由配置文件urls.py,关于密码重置的url配置主要如下:

from django.urls import path

from . import views

app_name = 'user'
urlpatterns = [
	
    path('password_reset/', views.PasswordReset.as_view(), name='password_reset'),
    path('password_reset/done/', views.PasswordResetDone.as_view(), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', views.PasswordResetConfirm.as_view(), name='password_reset_confirm'),
    path('reset/done/', views.PasswordResetComplete.as_view(), name='password_reset_complete'),
]

4.在忘记密码的地方加上链接即可。

<a href="{% url 'user:password_reset' %}">忘记密码</a>

除非标明,否则皆为<IT民工の在日生活 - 神户印象>原创之作,转载必须以明文链接标明出处。
本文链接:https://www.lifeinjp.net/share/419

发表评论