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 身份验证失败:未定义索引:模型

如何在管理面板中第一次登录django员工用户?

Angular 2 前端 django 2 REST 框架后端用户身份验证

mysql有关权限的表都有哪几个

mysql中某个字段出现重复数据,但该字段定义了唯一索引,not null ;不应出现这种情况,啥原因造成的?

如何在2个服务器之间进行通用认证--Rails和Django