编辑模型实例时限制用户权限的最佳做法是什么
What is best practice for restricting user permissions when editing model instances
我正在使用 User Authentication 构建一个简单的应用程序。
我的应用有 3 个模型:
- Users : 标准的 Django 用户模型
- 位置:办公室模型(地址、站点名称等)
- 员工:员工的模型(姓名、电子邮件等)
我还有一系列允许用户登录、创建和编辑 locations/sites 等的视图
我想知道的是,将模型实例的编辑限制为用户创建的模型实例的最佳做法是什么?例如。在没有修改的情况下,两个用户可以创建数据并且都可以编辑其他用户。我如何将其限制为自己编辑?
我知道长格式的方法是在每个模型上放置一个 ForeignKey(User)
以使用 queryset
限制视图,但这看起来冗长且麻烦。我缺少 Django 技巧吗?也许是装饰师?
最佳做法是什么?
最简单的方法是编辑您的模型,使它们有一个 owner
或 user
字段,对创建者来说是 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
如果每个 Location
和 User
可以有多个关系,您可以使用 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
我正在使用 User Authentication 构建一个简单的应用程序。
我的应用有 3 个模型:
- Users : 标准的 Django 用户模型
- 位置:办公室模型(地址、站点名称等)
- 员工:员工的模型(姓名、电子邮件等)
我还有一系列允许用户登录、创建和编辑 locations/sites 等的视图
我想知道的是,将模型实例的编辑限制为用户创建的模型实例的最佳做法是什么?例如。在没有修改的情况下,两个用户可以创建数据并且都可以编辑其他用户。我如何将其限制为自己编辑?
我知道长格式的方法是在每个模型上放置一个 ForeignKey(User)
以使用 queryset
限制视图,但这看起来冗长且麻烦。我缺少 Django 技巧吗?也许是装饰师?
最佳做法是什么?
最简单的方法是编辑您的模型,使它们有一个 owner
或 user
字段,对创建者来说是 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
如果每个 Location
和 User
可以有多个关系,您可以使用 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