看了权限Django文档,还是一头雾水。 我想阻止用户访问编辑或删除他们不拥有的对象。 我以这种方式编辑它并且它有效:
在 views.py 中:
def deleteReward(request, reward_id):
reward = get_object_or_404(Reward, pk=reward_id)
if reward.owner.user != request.user: # if the user linked to the reward is not the current one
raise Exception("This reward is not yours, you can't delete it !")
#...
但我认为这不是干净和干燥的,原因有二:
在每个 editStuff 和 deleteStuff View 中,我必须编写相同的代码部分。
我目前正在使用 Tastypie 编写 API,如果权限逻辑在 View 中,我将无法重复使用它。最好的处理方式似乎是将API权限映射到Django权限(但我认为我写的代码与权限无关)。
你能帮我找到正确的方法吗? 非常感谢。
最佳答案
这是我的工作示例。
1) 查询集
class PermissionQuerySet(models.query.QuerySet):
def editable_by(self, user):
return self.filter(user=user)
def viewable_by(self, user):
return self.filter(user=user)
2) 经理
class PermissionManager(models.Manager):
def get_query_set(self):
return PermissionQuerySet(self.model)
def editable_by(self, user, *args):
return self.get_query_set().editable_by(user, *args)
def viewable_by(self, user, *args):
return self.get_query_set().viewable_by(user, *args)
3)模型
class MyModel(models.Model):
...
objects = PermissionManager()
这种方法非常适合基于类的 View 。我看到你在使用 TastyPie。我以前从未使用过它,但它似乎也使用了基于类的 View 。
这是工作示例:
class MyUpdateView(UpdateView):
def post(self, request, *args, **kwargs):
self.request = request
super(MyUpdateView, self).post(request, *args, **kwargs)
def get_query_set(self):
queryset = super(MyUpdateView, self).get_query_set()
queryset = queryset.editable_by(self.request.user)
if not queryset.exists():
raise Exception("This reward is not yours, you can't delete it !")
return queryset
我想你可以想象如何在CreateView、DeleteView中使用这种方式。而且我认为在 TastyPie 中很容易实现这一点。
关于python - Django:防止编辑/删除对象的更干的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22178928/