如何自定义Django-Jazzmin登录页面及密码重置功能
问题解决步骤
- 调整路由匹配顺序
Django路由按从上到下的优先级匹配,你当前把path('admin/', admin.site.urls)放在最开头,访问/admin下的登录页时会优先走Admin默认的登录逻辑,不会触发你自定义的登录路由。需要把所有自定义的认证相关路由移到admin路由的前面:
urlpatterns = [ # 自定义认证路由放在最前面 url(r'^.*password_reset/$', auth_views.PasswordResetView.as_view(subject_template_name='registration/html_password_reset_subject.txt', html_email_template_name='registration/html_password_reset_email.html'), name='password_reset'), url(r'^.*password_reset/done/$', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'), url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), url(r'^reset/done/$', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), url(r'^.*logout/$', logout,{'next_page': 'myapp:login'}), url(r'^.*accounts/login/$', LoginView.as_view(template_name='registration/login.html'), name='login'), url(r'^.*accounts/profile/', TemplateView.as_view(template_name='registration/profile.html'), name='profile'), url(r'^login/$', LoginView.as_view(template_name='registration/login.html'), name='login'), url(r'^logout/$', logout, name='logout'), # admin路由放最后 path('admin/', admin.site.urls), ]
- 调整INSTALLED_APPS优先级
Django加载模板时会按照INSTALLED_APPS的注册顺序查找,你需要把自己的项目应用放在jazzmin和django.contrib.admin的前面,保证你的自定义模板优先级高于Jazzmin默认模板:
INSTALLED_APPS = [ # 你的自定义应用放在最前 'myapp', # 再放jazzmin 'jazzmin', # 再放django默认admin 'django.contrib.admin', # 其余应用... ]
同时确认settings.py中TEMPLATES配置里已经添加了项目根目录的templates路径:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # 确认这行存在 'APP_DIRS': True, # 其余配置... }, ]
- 直接在Jazzmin配置中指定自定义登录模板
可以通过settings.py中的JAZZMIN_SETTINGS配置项强制指定登录模板,优先级最高:
JAZZMIN_SETTINGS = { # 其余jazzmin配置... "login_template": "registration/login.html", }
- 清理重复路由配置
你当前路由里重复定义了多个同名的login路由,模糊的正则^.*也可能导致匹配混乱,建议清理冗余配置,避免路由冲突。
内容的提问来源于stack exchange,提问作者user2641103
相关产品推荐
相关产品推荐

