我正在使用User Authentication构建一个简单的应用。
我的应用有3种型号:
我还有一系列视图,允许用户登录,创建和编辑位置/网站等。
我想知道的是,将模型实例的编辑限制为用户创建的实例的最佳做法是什么?例如。没有修改,两个用户可以创建数据,两者都可以编辑其他用户。如何将其限制为编辑自己的?
我知道长形式的方法是在每个模型上放置ForeignKey(User)
以使用queryset
来限制视图,但这看起来很冗长而且很麻烦。有没有我丢失的Django技巧?也许是装饰师?
最佳做法是什么?
答案 0 :(得分:4)
最简单的方法是修改模型,使其拥有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