我有一个看起来像这样的模型:
class Change(models.Model): RFC = models.CharField(max_length=10) Ticket_Number = models.CharField(max_length=10) Plan_Owner = models.ForeignKey(User)
然后我通过这个在Django管理员中注册模型:
class ChangeAdmin(admin.ModelAdmin): search_fields = ('RFC', 'Ticket_Number','Plan_Owner') list_display = ('RFC', 'Ticket_Number','Plan_Owner') fieldsets = [ ('Ticket Details', { 'fields': ['RFC', 'Ticket_Number', 'Plan_Owner']}), ] admin.site.register(Change, ChangeAdmin)
我想要实现的是确保特定更改的Plan_owner是唯一可以在超级用户之外编辑它的人.每个人都可以查看它,但计划所有者是唯一可以对其进行更改的人.另外,通过编辑,我的意思是,他可以做任何事情,但删除一行.我已经看过Django监护人,它完全符合我的要求但是必须手动为每一行设置监护人的权限.我正在寻找一个解决方案,其中这些权限是根据我的要求自动设置的...
我不会使用对象级权限来处理与您的要求一样简单的事情.你只需要有一个owner
ForeignKey的到模型中,只允许每个对象的所有者对其进行修改(您可以使用Plan_Owner
- 请改为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
.