我想知道如何使用django模型完成一个简单的"对象所有权"系统,这样,默认情况下,只有对象的所有者才能编辑它.
我试图允许"管理"组代表对象所有者编辑所有对象,并在此时添加了自定义权限:
class Meta:
permissions = (
("manage_object", "Can manage objects"),
)
Run Code Online (Sandbox Code Playgroud)
为了建立"所有权",我已经玩弄了为模型添加def的想法:
def owner(self):
return self.user
Run Code Online (Sandbox Code Playgroud)
但那么,我怎么可能走得更远呢?我可以在视图中实现权限并使用模板显示相关的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
Run Code Online (Sandbox Code Playgroud)
...然后在模板级别上呈现不同的UI元素.
所以,问题是:
非常感谢!
Ste*_*eef 17
我的方法是为模型添加一个方法:
class YourModelWithOwnership(models.model):
...
def user_can_manage_me(self, user):
return user == self.user or user.has_perm('your_app.manage_object')
Run Code Online (Sandbox Code Playgroud)
每当需要进行权限检查时,我都会调用该方法,并根据结果采取一些措施.所以对于一个可能的观点
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:
...
Run Code Online (Sandbox Code Playgroud)
后来我可能会意识到,在每个需要该测试的视图中都要写一些样板代码,所以我实现了一个异常,当用户无法管理对象时抛出异常...
class CannotManage(Exception):
pass
Run Code Online (Sandbox Code Playgroud)
...并为模型添加另一种方法:
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
Run Code Online (Sandbox Code Playgroud)
然后,在视图函数中,可以使用:
def view_func(request, item_id):
item = YourModelWithOwnership.get_manageable_object_or_404(request.user, id=item_id)
...
Run Code Online (Sandbox Code Playgroud)
当用户不是所有者并且没有适当的权限时,这当然会引发异常.可以在自定义中间件类的process_exception()方法中处理该异常,以便为不允许用户弄乱该对象的所有实例存在单个处理程序.
| 归档时间: |
|
| 查看次数: |
6409 次 |
| 最近记录: |