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
相关产品推荐
相关产品推荐

