最近在使用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>