在编辑模型实例时限制用户权限的最佳做法是什么

时间:2015-08-22 22:48:35

标签: python django django-authentication django-permissions

我正在使用User Authentication构建一个简单的应用。

我的应用有3种型号:

  • 用户:标准的Django用户模型
  • 地点:办公室的模型(地址,网站名称等)
  • 员工:员工的模型(姓名,电子邮件等)

我还有一系列视图,允许用户登录,创建和编辑位置/网站等。

我想知道的是,将模型实例的编辑限制为用户创建的实例的最佳做法是什么?例如。没有修改,两个用户可以创建数据,两者都可以编辑其他用户。如何将其限制为编辑自己的?

我知道长形式的方法是在每个模型上放置ForeignKey(User)以使用queryset来限制视图,但这看起来很冗长而且很麻烦。有没有我丢失的Django技巧?也许是装饰师?

最佳做法是什么?

1 个答案:

答案 0 :(得分:4)

最简单的方法是修改模型,使其拥有owneruser字段,该字段为创建者的ForeignKey

class Locations(models.Model):
    owner = ForeignKey(User)
    ...

在你的意见中:

def edit_location(request, location_id):
    location = Locations.objects.get(pk=location_id)
    if request.user is not location.owner:
        # return a 401 or redirect to somewhere
    else:
        # do stuff

如果每个LocationUser可以有多个关系,则可以使用Django的ManyToManyField选项。例如:

class Locations(models.Model):
    owners = models.ManyToManyField(User)

user = User.objects.create(username='Ian')
location = Locations.objects.create(...)
location.owners.add(user)

然后User / Locations同时可用:

>>> location.owners.all()
[<User: Ian>]
>>> user.locations_set.all()
[<Locations: ...>]

将自动创建User上的设置,并将其命名为<Model Name>_set

然后,您可以使用in运算符检查所有权:

def edit_location(request, location_id):
        location = Locations.objects.get(pk=location_id)
        if request.user in location.owners.all():
            # return a 401 or redirect to somewhere
        else:
            # do stuff