You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:55:24