gpt4 book ai didi

django - Django 中的对象所有权

转载 作者:行者123 更新时间:2023-12-04 03:06:07 26 4
gpt4 key购买 nike

我想知道如何使用 django 模型完成一个简单的“对象所有权”系统,这样,默认情况下,只有对象的所有者可以编辑它。

我试图允许“管理”组代表对象所有者编辑所有对象,并且此时添加了自定义权限:

class Meta:
permissions = (
("manage_object", "Can manage objects"),
)

为了建立“所有权”,我想到了向模型添加 def 的想法:
def owner(self):
return self.user

但是,我怎么能走得更远呢?我可以在 View 中实现权限并使用模板显示相关的 UI,即:
if request.user is object.owner:
# ... do stuff
elseif request.user.has_perm.can_manage: # this line is probably not right
# ... do something else

...然后在模板级别呈现不同的 UI 元素。

所以,问题是:
  • 这种方法有什么缺点/好处?
  • 有建议吗?
  • 或者,任何其他以前实现的方法?

  • 最好的感谢!

    最佳答案

    我的方法是向模型添加一个方法:

    class YourModelWithOwnership(models.model):
    ...

    def user_can_manage_me(self, user):
    return user == self.user or user.has_perm('your_app.manage_object')

    然后,每当需要进行权限检查时,我都会调用该方法,并根据结果采取一些措施。所以对于一个观点来说
    from django.shortcuts import get_object_or_404
    ...

    def view_func(request, item_id):
    item = get_object_or_404(YourModelWithOwnership, id=item_id) # or whatever is needed to get the object
    if not item.user_can_manage_me(request.user):
    # user not allowed to manage
    ...
    else:
    ...

    后来我可能会意识到,在需要该测试的每个 View 中仍然需要编写相当多的样板代码,所以我会实现一个当用户无法管理对象时抛出的异常......
    class CannotManage(Exception):
    pass

    ...并向模型添加另一个方法:
    from django.db import models
    from django.shortcuts import get_object_or_404

    class YourModelWithOwnership(models.model):
    ...

    @classmethod
    def get_manageable_object_or_404(cls, user, *args, **kwds):
    item = get_object_or_404(cls, *args, **kwds)
    if not item.user_can_manage_me(user):
    raise CannotManage
    return item

    然后,在 View 函数中,可以使用:
    def view_func(request, item_id):
    item = YourModelWithOwnership.get_manageable_object_or_404(request.user, id=item_id)
    ...

    当用户不是所有者并且没有适当的权限时,这当然会引发异常。该异常可以在 process_exception() 中处理。 custom middleware的方法类,以便对于不允许用户弄乱对象的所有实例都有一个处理程序。

    关于django - Django 中的对象所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/999078/

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