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

Django中is_staff用户登录重定向自定义模板问题解决

解决Staff用户登录后跳转到Django Admin而非自定义仪表盘的问题

看起来你的普通用户重定向逻辑没问题,但Staff用户总是被导向Django默认Admin页面,大概率是Django内置的认证机制或者路由优先级在搞鬼,咱们一步步排查解决:

1. 先排查是否误走了Django默认Admin登录流程

如果你的Staff用户是通过/admin/login这个默认路径登录的,Django会自动把认证后的Staff用户重定向到/admin页面,完全绕开了你自定义的login视图。

解决办法:

  • 强制所有用户(包括Staff)都通过你自定义的/login路径登录,别用Django自带的Admin登录入口。
  • 如果需要保留Admin入口,可以在settings.py里修改Admin的登录后跳转配置,但最直接的还是统一用自定义登录页。

2. 修正Login视图的冗余逻辑,加调试点确认流程

你的login视图里有重复的判断,还容易和Django内置的login视图重名冲突,咱们改得更简洁还能排查问题:

修改后的views.py登录视图:

from django.contrib import auth, messages
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required

# 把视图名改成custom_login,避免和Django内置login视图重名
def custom_login(request):
    # 已登录用户直接跳转
    if request.user.is_authenticated:
        return redirect('staff_dashboard') if request.user.is_staff else redirect('user_dashboard')
    
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = auth.authenticate(request, username=username, password=password)
        
        if user is not None:
            auth.login(request, user)
            # 加个打印调试,确认是否进入了Staff分支
            print(f"当前登录用户是Staff: {user.is_staff},将跳转至staff_dashboard")
            return redirect('staff_dashboard') if user.is_staff else redirect('user_dashboard')
        else:
            messages.info(request, "账号或密码错误")
            return redirect('custom_login')
    
    # GET请求返回登录页面(记得替换成你的登录模板路径)
    return render(request, 'login.html')

同步更新urls.py里的路由,保持name='login'不变(其他地方的引用不用改):

urlpatterns = [
    path('', views.home, name='home'),
    path('login', views.custom_login, name='login'),  # 这里改成custom_login视图
    path('user/dashboard', views.user_dashboard, name='user_dashboard'),
    path('staff/dashboard', views.staff_dashboard, name='staff_dashboard'),
]

3. 确认Staff仪表盘的模板路径没踩坑

你当前staff_dashboard视图里用的模板是'admin/index.html',这很容易误加载Django默认的Admin模板!如果你的自定义Staff仪表盘模板放在templates/staff/index.html,一定要改成:

return render(request,'staff/index.html',context)

同时检查urls.py里的staff/dashboard路径,确保和Django Admin的/admin路径没有冲突(默认是没问题的,但还是确认下)。

4. 加调试点确认Staff仪表盘视图是否被触发

如果前面的步骤都试过还是不行,在staff_dashboard视图里加个打印,看看这个视图有没有被访问到:

@login_required(login_url='login')
def staff_dashboard(request):
    print("成功进入Staff自定义仪表盘视图!")
    vid_size = []
    img_query_set = model_images.objects.all()
    img_query_set_count = model_images.objects.all().count()
    vid_query_set = model_videos.objects.all()
    vid_query_set_count = model_videos.objects.all().count()
    for item in vid_query_set:
        size = round(item.vid_path.size / 1000000,1)
        vid_size.append(size)
    context = {
        "img_query_set": img_query_set,
        "vid_query_set": vid_query_set,
        "img_query_set_count": img_query_set_count,
        "vid_query_set_count": vid_query_set_count,
    }
    return render(request,'staff/index.html',context)

这样就能快速定位是重定向没触发,还是视图本身没被访问到。


内容的提问来源于stack exchange,提问作者ikhwan_rosli96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:52:37