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

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的行为:

  1. 在你的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(你的模型类)
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:15:30