【问题标题】:Setting up conditional views in Django based on user permissions根据用户权限在 Django 中设置条件视图
【发布时间】:2018-03-29 00:17:44
【问题描述】:

我正在尝试在 django 中设置一个索引页面,该页面根据用户权限(2 种以上类型的用户)提供不同的内容。我已经研究过使用 @permission_required 装饰器,但是将它与大部分重复的视图一起使用似乎有点浪费和重复。我也看不到好的后备方法(我不能做@permission_required(!'jobs.can_edit'))。

views.py:

@permission_required('jobs.can_add')
def index(request):
    jobs = Job.objects.all
    context = {
        "jobs": jobs,
    }
    return render(request, 'jobs/index.html', context)

@permission_required('jobs.can_edit')
def index(request):
    jobs = some.different.data
    context = {
        "jobs": jobs,
    }
    return render(request, 'jobs/index.html', context)

有没有更简单的方法可以将它挂接到索引函数并根据用户权限更改上下文?我的理想场景应该是这样的

想象的views.py:

def index(request):
    if user.can_add:
        context = x
        return render(request, 'jobs/index/can-add.html', context)

    context = y
    return render(request, 'jobs/index/can-edit.html', context)

我还按名称设置了三个用户组,但我没有看到太多关于访问组名的文档。

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果您使用 django 权限,那么您可以在视图中执行此操作

    def index(request):
        if request.user.has_perm('app_name.permission_name'):
           #return something if true
        #return something in else case
    

    我建议使用组并将权限分配给组并检查用户是否属于视图中的组 试试this

    【讨论】:

      【解决方案2】:

      我受到了启发,我也想将我的回应分享给其他人,但就我而言,我使用 DRF 和 django 组。

      class ShopOrderCreateList(APIView):
          permission_classes = [AllowAny]
      
          @staticmethod
          def get_object(shop_id):
              try:
                  return Shop.objects.get(id=shop_id)
      
              except Shop.DoesNotExist:
                  raise Http404
      
          def get(self, request, shop_id=None):
              shop = self.get_object(shop_id)
              orders = Order.objects.filter(shop__id=shop.id)
              # orders = manager.order_set.all()
              # shop_orders = shop
              # order_numbers = orders.count()
      
              serializer = OrderSerializer(orders, many=True)
      
              return Response(serializer.data)
      
          @staticmethod
          def post(request, shop_id=None):
              if request.user.groups.filter(name='admin').exists():
                  manager = request.user.manager
              elif request.user.groups.filter(name='master').exists():
                  master = request.user.master
                  manager = master.manager
      

      【讨论】:

        猜你喜欢
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多