我不会将对象级权限用于您的要求这样简单的事情。您只需要为owner
您的模型设置一个 ForeignKey,并且只允许每个对象的所有者对其进行修改(您可以使用Plan_Owner
--PLEASE将其更改为plan_owner
并Ticket_Number
与ticket_number
pep 8 和 django 样式指南兼容)。
我写了一篇文章,描述了如何在 django 中执行此操作:
http://spapas.github.io/2013/11/05/django-authoritiy-data/
实际上,我正在描述如何使用用户所属的权限,并且每个用户都可以编辑其权限的对象,但您的要求已涵盖。
更新
为了完整起见,我在这里添加了实现:
您的创建和更新基于类的视图必须将请求传递给您的表单,并且您的详细信息和更新 CBV 应该只允许获取属于用户的对象(假设您的模型名为UserData
:
class UserDataCreateView(CreateView):
model=models.UserData
def get_form_kwargs(self):
kwargs = super(UserDataCreateView, self).get_form_kwargs()
kwargs.update({'request': self.request})
return kwargs
class UserDataDetailView(DetailView):
def get_object(self, queryset=None):
obj = super(UserDataDetailView, self).get_object(queryset)
if not user_has_access(obj, self.request):
raise Http404(u"Access Denied")
return obj
class UserDataUpdateView(UpdateView):
model=models.AuthorityData
def get_form_kwargs(self):
kwargs = super(UserDataUpdateView, self).get_form_kwargs()
kwargs.update({'request': self.request})
return kwargs
def get_object(self, queryset=None):
obj = super(UserDataUpdateView, self).get_object(queryset)
if not user_has_access(obj, self.request):
raise Http404(u"Access Denied")
return obj
它检查 是否request.user
具有权限(是对象的所有者)并且还将 传递request
给ModelForm
. 上面定义的has_access
函数只是检查当前用户是否是对象的所有者:
def has_access(obj, req):
if req.user == obj.owner:
return True
return False
Yot ModelForm 应该是这样的(创建/更新相同):
class UserDataModelForm(forms.ModelForm):
class Meta:
model = models.UserData
exclude = ('owner',)
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(ActionModelForm, self).__init__(*args, **kwargs)
def save(self, force_insert=False, force_update=False, commit=True):
obj = super(UserDataModelForm, self).save(commit=False)
if obj:
obj.owner = self.request.user
obj.save()
return obj
request
它从中删除kwargs
并将其设置为属性,并在保存时将对象的所有者设置为reqest.user
.