gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:21:17 25 4
gpt4 key购买 nike

我正在使用 User Authentication 构建一个简单的应用程序.

我的应用有 3 个模型:

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

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

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

我知道长格式的方法是在每个模型上放置一个 ForeignKey(User) 以使用 queryset 限制 View ,但这看起来冗长且麻烦。我缺少 Django 技巧吗?也许是装饰师?

最佳做法是什么?

最佳答案

最简单的方法是编辑您的模型,使它们具有 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

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

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运算符(operator)检查所有权:

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

关于python - 编辑模型实例时限制用户权限的最佳做法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32161516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com