Django 身份验证:员工索引和用户索引(2 个模板)
Posted
技术标签:
【中文标题】Django 身份验证:员工索引和用户索引(2 个模板)【英文标题】:Django authentication: index for staff and index for user (2 templates) 【发布时间】:2021-11-23 04:29:30 【问题描述】:我目前有 2 个功能正在运行,一个是 is_staff 用户的特定视图,另一个是任何用户的特定视图。 现在工作人员登录后可以在URL中添加路径/dashboard,可以访问该路由,而普通用户无法查看。这是意料之中的好事。
问题:我想在登录时将 user.is_staff 直接重定向到此路径 /dashboard,而不是先进入索引。
我认为我必须合并的功能: (views.py)
1 @staff_member_required
2 def staff_dashboard(request):
3 users = User.objects.all()
4 customer = Customer.objects.all()
5 accounts = Account.objects.all()
6 context =
7 'users': users,
8 'customer': customer,
9 'accounts': accounts
10
11 return render(request, 'bank_app/dashboard.html', context)
12
13
14 @login_required
15 def index(request):
16 customer = Customer.objects.filter(user=request.user)
17 accounts = Account.objects.filter(user=request.user)
18 context =
19 'customer': customer,
20 'accounts': accounts
21
22 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'),
]
当用户是_staff时,显示“dashboard/
”(dashboard.html),而不是""
(index.html)
*我也看到了下面的扩展模板,但这并没有解决问题:
28 <p>Welcome user </p>
29
30 % if user.is_staff %
31 % block staffcontent %
32 % endblock %
33 % else %
34 % block content %
35 % endblock %
36 % endif %
37
38 % block footer %
39 % endblock %
##################更新 ####################
到目前为止,这是可行的,但我仍然需要重构:
10 @login_required
11 def index(request):
12 if request.user.is_staff:
##13 @staff_member_required
##14 def staff_dashboard(request):
15 users = User.objects.all()
16 customer = Customer.objects.all()
17 accounts = Account.objects.all()
18 context =
19 'users': users,
20 'customer': customer,
21 'accounts': accounts
22
23 return render(request, 'bank_app/dashboard.html', context)
##24 return HttpResponseRedirect('staff_dashboard')
25 else:
##26 def user_dashboard():
27 customer = Customer.objects.filter(user=request.user)
28 accounts = Account.objects.filter(user=request.user)
29 context =
30 'customer': customer,
31 'accounts': accounts
32
33 return render(request, 'bank_app/index.html', context)
34
我被指示在声明中使用装饰器-教师要求:/-(因为只有员工可以查看部分内容)并使用 HttpResponse 来显示正确的 html。 知道如何重构吗?
我正在尝试添加在注释掉的行 (##) 上看到的逻辑
(urls.py):
5 urlpatterns = [
6 path('', views.index, name='index'),
##7 path('staff_dashboard', views.index, name='staff_dashboard'),
##8 path('user_dashboard/', views.index, name='user_dashboard'),
##############解决方案##################
按照 cmets 中的建议,我已修复 urls.py 并将请求拆分到 views.py 中:
1 @login_required
2 def index(request):
3 if request.user.is_staff:
4 return HttpResponseRedirect('staff_dashboard/')
5 else:
6 return HttpResponseRedirect('user_dashboard/')
7
8
9 @staff_member_required
10 def staff_dashboard(request):
11 users = User.objects.all()
12 customer = Customer.objects.all()
13 accounts = Account.objects.all()
14 context =
15 'users': users,
16 'customer': customer,
17 'accounts': accounts
18
19 return render(request, 'bank_app/dashboard.html', context)
20
21
22 @login_required
23 def user_dashboard(request):
24 customer = Customer.objects.filter(user=request.user)
25 accounts = Account.objects.filter(user=request.user)
26 context =
27 'customer': customer,
28 'accounts': accounts
29
30 return render(request, 'bank_app/index.html', context)
(urls.py):
1 urlpatterns = [
2 path('', views.index, name='index'),
3 path('staff_dashboard/', views.staff_dashboard, name='staff_dashboard'),
4 path('user_dashboard/', views.user_dashboard, name='user_dashboard'),
【问题讨论】:
【参考方案1】:试试这样的。
@login_required
def index(request):
if request.user.is_superuser:
return redirect('staff_dashboard')
else:
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)
要检查用户是否是 is_staff,您可以执行以下操作 user.is_staff 或 user.is_superuser。 让我知道它是否有效。
【讨论】:
逻辑有效,但我仍然需要重构并在 if-else 中添加 @staff_member_required 装饰器。在 index 视图的功能上,我需要显示“dashboard.html”或“index.html”(取决于用户角色)我已经更新了问题的更多详细信息,请您帮忙看看? @patbet 你没有做的一点都不好。你的 def user_dashboard(request) 和 def staff_dashboard(request) 应该有自己的 url。然后在你的索引中你可以使用“redirect( )" 以根据您的条件将使用重定向到这些 url。 当我添加正确的 URL 所以path('staff_dashboard', views.staff_dashboard, name......
我得到一个错误:module 'bank_app.views' has no attribute 'staff_dashboard' 这是有道理的,因为在视图中我我没有直接调用staff_dashboard
,但我在主函数def index(request)
中有它——这就是为什么在urls.py 中我为它们都设置了views.index
。这有意义吗?
@patbet 首先在 views.py 中创建一个函数“staff_dashboard”并为其添加你的 url。就像你之前所做的那样。然后对“user_dashboard”做同样的事情。毕竟这您创建 def index(request),然后在此函数中创建我在此处编写的条件,然后将用户重定向到特定视图。
堆栈溢出永远是最好的来源!听从你的建议后,它可以工作了,非常感谢!以上是关于Django 身份验证:员工索引和用户索引(2 个模板)的主要内容,如果未能解决你的问题,请参考以下文章
使用新模型和保护的 Laravel 身份验证失败:未定义索引:模型
Angular 2 前端 django 2 REST 框架后端用户身份验证