Django自定义Admin登录页失效:如何替换默认登录跳转至自定义认证页
解决Django Admin自定义登录重定向问题
你的代码没生效的核心原因是admin.site.urls中已经包含了默认的admin/login/路由,且它在你的自定义路由前面,Django会优先匹配靠前的URL规则;同时你设置的路由名称admin/login也不符合Django Admin登录路由的命名空间规范。
下面提供两种可靠的解决方案:
方案一:调整URL匹配顺序并覆盖命名空间路由
把自定义的登录路由放在admin.site.urls前面,并且使用Admin登录路由的标准命名空间名称admin:login,确保Django优先匹配你的自定义视图:
urlpatterns = [ # 注意路径末尾的斜杠,和命名空间名称 path('admin/login/', SignInView.as_view(), name='admin:login'), path('admin/', admin.site.urls), # 其他路由... ]
方案二:自定义AdminSite(更规范的方式)
通过继承AdminSite类,直接修改登录跳转地址,这种方式不需要调整URL顺序,也能统一管理Admin的行为:
- 在你的
admin.py中定义自定义AdminSite:
from django.contrib.admin import AdminSite from .models import 你的模型类 # 替换成实际需要注册的模型 class CustomAdminSite(AdminSite): # 设置未认证用户跳转的登录地址 login_url = '/auth/sign-in' # 初始化自定义site并注册模型 custom_admin_site = CustomAdminSite(name='custom_admin') custom_admin_site.register(你的模型类)
- 在
urls.py中使用自定义的site替代默认的admin.site.urls:
from .admin import custom_admin_site urlpatterns = [ path('admin/', custom_admin_site.urls), # 其他路由... ]
可选:直接拦截未认证用户访问Admin
如果不需要跳转登录页,而是直接拦截未认证用户(返回403),可以在自定义AdminSite中重写has_permission方法:
class CustomAdminSite(AdminSite): def has_permission(self, request): # 仅允许已认证用户访问Admin return request.user.is_authenticated
内容的提问来源于stack exchange,提问作者moin moin
相关产品推荐
相关产品推荐

