Django中重写accounts/login/路由失效问题求助
解决Django替换auth默认登录路由的问题
核心问题原因
Django的路由匹配是从上到下按顺序匹配的,你之前把自定义的accounts/login路由写在了include("django.contrib.auth.urls")之后,请求会先匹配到auth模块自带的accounts/login路由,导致你的自定义路由无法生效。
分步解决方案
1. 调整项目urls.py的路由顺序
把自定义的accounts/login相关路由移到include("django.contrib.auth.urls")前面,确保优先匹配:
from core import views urlpatterns = [ path("admin/", admin.site.urls), # 优先匹配自定义登录路由 path("accounts/login", views.atest, name="login"), path("accounts/login/", views.atest, name="login"), # 再包含auth的其他路由 path("accounts/", include("django.contrib.auth.urls")), path("", include("core.urls")), path("user/", include("user.urls")), ]
2. 配置user应用的自定义登录路由
在user/urls.py中添加c-login的路由,指向你的自定义登录视图:
from django.urls import path from . import views urlpatterns = [ path("c-login/", views.custom_login, name="c-login"), # 其他user应用路由... ]
3. 补全自定义登录视图逻辑
你当前的custom_login视图仅定义了template_name,没有返回响应,需要完善成可正常工作的视图。推荐复用Django的LoginView减少重复代码:
from django.contrib.auth.views import LoginView from django.shortcuts import redirect def atest(request): return redirect("c-login") # 完善自定义登录视图(类视图方式) class CustomLoginView(LoginView): template_name = "registration/login.html" # 可自定义登录成功后的跳转地址 # success_url = "/user/dashboard/" # 若偏好函数视图,可这样写: # def custom_login(request): # if request.method == "POST": # # 自行处理登录逻辑(验证用户、会话设置等) # pass # return render(request, "registration/login.html")
如果使用类视图,记得同步修改user/urls.py中的路由:
path("c-login/", views.CustomLoginView.as_view(), name="c-login"),
额外说明
- 保留
django.contrib.auth.urls后,你仍可正常使用其他auth自带路由(如accounts/logout、accounts/password_reset等),仅会替换name="login"对应的路由。 - 确保
name="login"的路由唯一,避免命名冲突,这里通过路由顺序优先级实现覆盖。
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

