python - Django:防止编辑/删除对象的更干的方法?

标签 python django django-views tastypie

看了权限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 !")
    #...

但我认为这不是干净和干燥的,原因有二:

  1. 在每个 editStuff 和 deleteStuff View 中,我必须编写相同的代码部分。

  2. 我目前正在使用 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/

相关文章:

python - 基于列标题的行级求和的有效方法

css - 如何将css添加到django中的默认表单元素

python - Django with mysql - 加载 mysqldb 模块时出错

django - 基于 ForeignKey 对象从模型中获取对象

python - 已弃用的 scipy imresize() 函数的替代品?

python - 以列表年和月的形式获取日期之间的差异

python - 使用 Django REST 框架从多个模型返回结果

python - 如何使 Django 下拉表单显示用户而非所有用户拥有的项目?

Python:用于 Python2.7 和 Python3.x 的最新 GUI 调试器,没有 IDE

python - 如何为模板标签解析 Django 模板