确保当前用户只能对他的数据django / python进行更改

时间:2017-07-03 09:21:28

标签: python django

我希望只有当前用户才能对django中的数据进行更改

例如激活/停用他创建的内容..

这是我的激活产品的视图功能:

def Activer(request, produit_id):
   produit = Produit.objects.get(pk=produit_id)
   produit.etat = "active"
   produit.save()
   return JsonResponse({'success':True})

这是我在produit.html中的代码:

{% if produit.etat == "active" %}

但是所有用户都可以访问..

3 个答案:

答案 0 :(得分:1)

您需要检查当前用户是否创建了Produit,否则告诉用户不允许编辑Produit。

def Activer(request, produit_id):
   produit = Produit.objects.get(pk=produit_id)
   if produit.user.id == request.user.id: ## check if this produit is created current user.
       produit.etat = "active"
       produit.save()
       return JsonResponse({'success':True})
   else: # else response the user that not allowed to edit the Produit.
       return JsonResponse({'error':'You are not allowed to edit this product.'})

答案 1 :(得分:1)

@login_required    
def Activer(request, produit_id):
    try:
        produit = Produit.objects.get(pk=produit_id)

        if produit.user == request.user: ## check if this produit is created by current user.
            produit.etat = "active"
            produit.save()

            return JsonResponse({'success':True})

        else: # else response the user that not allowed to edit the Produit.

           return JsonResponse({'error':'You are not allowed to edit this produit.'})

    except Produit.DoesNotExist:
        return JsonResponse({'error' : 'object dose not exist'})

如果您希望 请求 对象中的 request.user 作为经过身份验证的用户而不是匿名用户,你应该在登录状态下调用你的视图。

答案 2 :(得分:0)

最好只使用update()而不是选择,更新,保存:

@login_required
def Activer(request, produit_id):
    count = Produit.objects.filter(pk=produit_id, user=request.user).update(etat='active')
    return JsonResponse({'success': count == 1}

这样做的好处是可以避免在从数据库加载对象并随后将其保存回来之间可能发生的竞争条件。