Django项目重置/修改密码时重定向至Admin模板问题求助
问题描述
使用Django registration组件覆写了reset_password和change_password视图,该配置在其他项目中可正常工作,但在Django 2.2.5 + Docker的新项目中,执行相关操作时会被重定向至Admin模板而非自定义模板。相关配置代码如下:
settings.py 配置
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.sites', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'registration.apps.RegistrationConfig', ]
urlpatterns = [ path('authentification/', include('registration.urls')), path('registration/', include('django.contrib.auth.urls')), ]
registration 应用的 urls.py
app_name='registration' urlpatterns = [ path('password_reset/', views.ResetPasswordView.as_view(success_url="/registration/login/"), name='password_reset'), path('password_change/', views.CustomPasswordChangeView.as_view(), name='password_change'), ]
视图类代码
class ResetPasswordView(SuccessMessageMixin, PasswordResetView): template_name = 'registration/password_reset_form.html' ... success_url = reverse_lazy('home') class CustomPasswordChangeView(SuccessMessageMixin, PasswordChangeView): form_class = CustomPasswordChangeForm template_name = 'registration/password_change_form.html' success_url = reverse_lazy('home')
排查原因
- URL匹配优先级问题:
django.contrib.auth.urls包含默认的password_reset和password_change路由,而自定义路由放在authentification/下,若用户访问/registration/password_reset/或/registration/password_change/,会优先匹配默认路由,进而加载Admin模板。 - 模板查找顺序问题:Django按
INSTALLED_APPS顺序查找模板,django.contrib.admin排在registration之前,若模板命名冲突(如都用registration/password_reset_form.html),会优先加载Admin的模板文件。 - success_url重复配置:
urls.py中给ResetPasswordView指定了success_url="/registration/login/",但视图类内部又定义了success_url = reverse_lazy('home'),双重配置可能导致重定向逻辑混乱,间接引发模板加载异常。
解决方案
1. 调整URL匹配顺序与路径
将自定义registration.urls移到django.contrib.auth.urls之前,确保自定义路由优先匹配;同时统一URL路径避免混淆:
urlpatterns = [ path('registration/', include('registration.urls')), path('registration/', include('django.contrib.auth.urls')), ]
若完全使用自定义路由,可直接移除django.contrib.auth.urls的引用。
2. 修改模板命名避免冲突
给自定义模板设置独特名称,避免与Admin模板重名:
class ResetPasswordView(SuccessMessageMixin, PasswordResetView): template_name = 'registration/custom_password_reset_form.html' ... class CustomPasswordChangeView(SuccessMessageMixin, PasswordChangeView): template_name = 'registration/custom_password_change_form.html' ...
同时同步修改对应模板文件的名称。
3. 统一success_url配置
删除urls.py中视图的success_url参数,保留视图类内部的定义,避免重复配置:
# registration/urls.py path('password_reset/', views.ResetPasswordView.as_view(), name='password_reset'),
4. 调整INSTALLED_APPS顺序
将registration应用移到django.contrib.admin之前,确保Django优先查找自定义应用的模板:
INSTALLED_APPS = [ 'registration.apps.RegistrationConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.sites', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
内容的提问来源于stack exchange,提问作者ELHADEF
相关产品推荐
相关产品推荐

