Django实现is_staff用户登录后自动跳转至dashboard专属页面方案
Django登录后按用户角色自动跳转视图的实现
问题背景
现有两个可正常运行的视图函数:
- 专为
is_staff用户提供的专属视图 - 面向所有登录用户的通用视图
当前staff用户登录后,可手动在URL后添加/dashboard路径访问对应路由,普通用户无权限访问该路径,该逻辑符合预期。
需求说明
希望在登录环节就完成身份判断,user.is_staff为真的用户直接跳转至/dashboard路径,无需先进入首页。
初始代码
views.py
@staff_member_required def staff_dashboard(request): users = User.objects.all() customer = Customer.objects.all() accounts = Account.objects.all() context = { 'users': users, 'customer': customer, 'accounts': accounts } return render(request, 'bank_app/dashboard.html', context) @login_required def index(request): customer = Customer.objects.filter(user=request.user) accounts = Account.objects.filter(user=request.user) context = { 'customer': customer, 'accounts': accounts } return render(request, 'bank_app/index.html', context)
urls.py
urlpatterns = [ path('dashboard', views.staff_dashboard, name='staff_dashboard'), path('', views.index, name='index'), path('create', views.create, name='create'), path('createaccount', views.createaccount, name='createaccount'), path('details/<int:pk>', views.details, name='details'), ]
已尝试未生效方案
尝试通过模板继承做身份判断切换内容块,未解决问题:
<p>Welcome {{ user }}</p> {% if user.is_staff %} {% block staffcontent %} {% endblock %} {% else %} {% block content %} {% endblock %} {% endif %} {% block footer %} {% endblock %}
更新:可运行但待重构代码
当前以下代码可运行,但需要按要求重构:教师要求在条件语句内部使用装饰器(仅staff可查看部分内容),并使用HttpResponse展示正确的html页面。
views.py
@login_required def index(request): if request.user.is_staff: ## @staff_member_required ## def staff_dashboard(request): users = User.objects.all() customer = Customer.objects.all() accounts = Account.objects.all() context = { 'users': users, 'customer': customer, 'accounts': accounts } return render(request, 'bank_app/dashboard.html', context) ## return HttpResponseRedirect('staff_dashboard') else: ## def user_dashboard(): customer = Customer.objects.filter(user=request.user) accounts = Account.objects.filter(user=request.user) context = { 'customer': customer, 'accounts': accounts } return render(request, 'bank_app/index.html', context)
urls.py
urlpatterns = [ path('', views.index, name='index'), ## path('staff_dashboard', views.index, name='staff_dashboard'), ## path('user_dashboard/', views.index, name='user_dashboard'), ]
最终解决方案
拆分视图逻辑、修正路由配置后的最终可运行代码如下:
views.py
@login_required def index(request): if request.user.is_staff: return HttpResponseRedirect('staff_dashboard/') else: return HttpResponseRedirect('user_dashboard/') @staff_member_required def staff_dashboard(request): users = User.objects.all() customer = Customer.objects.all() accounts = Account.objects.all() context = { 'users': users, 'customer': customer, 'accounts': accounts } return render(request, 'bank_app/dashboard.html', context) @login_required def user_dashboard(request): customer = Customer.objects.filter(user=request.user) accounts = Account.objects.filter(user=request.user) context = { 'customer': customer, 'accounts': accounts } return render(request, 'bank_app/index.html', context)
urls.py
urlpatterns = [ path('', views.index, name='index'), path('staff_dashboard/', views.staff_dashboard, name='staff_dashboard'), path('user_dashboard/', views.user_dashboard, name='user_dashboard'), ]
内容的提问来源于stack exchange,提问作者patbet
相关产品推荐
相关产品推荐

