根据用户权限在Django中设置条件视图

时间:2018-03-29 00:17:44

标签: python django

我试图在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)

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我受到了启发,我也想与其他人分享我的回应,但就我而言,我使用 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