Python Django(监护人):根据我的模型中的m2m字段编辑数据
问题描述:
我真的有让我的管理界面工作的麻烦。我有一个模型,该模型中的M2M场到组:Python Django(监护人):根据我的模型中的m2m字段编辑数据
from django.contrib.auth.models import Group
class Lecture(models.Model):
....
allowed_groups = models.ManyToManyField(Group)
....
现在,当模型保存,我想给这些群体特殊的观看权限,因此,只有这些组的成员被允许看到该模型的对象。我为每个对象权限使用django-guardian。所以,在我的模型的保存法我做这样的事情:
def save(self, *args, **kwargs):
allGroups = Group.objects.all()
super(Lecture, self).save(*args, **kwargs)
groups = self.allowed_groups.all()
viewright = 'view_lecture'
for ag in allGroups:
if ag in groups:
assign_perm(viewright, ag, self) #assign_perm comes from guardian
else:
remove_perm(viewright, ag, self) #remove_perm comes from guardian
我还试图用一个post_save信号,但问题是,我总是按保存按钮,在我的管理界面两次以做出任何更改(组总是以正确的方式添加,但仅在第二次通过管理界面中的保存按钮保存模型时添加权限)那么这里发生了什么?任何人都可以帮忙吗?
---编辑---
我的解决方案:让我感动的权限的分配码我的ModelAdmin类,这样的:
admin.py
class LectureAdmin(admin.ModelAdmin):
def save_model(self, request, lecture, form, change):
if not lecture.id:
lecture.owner = request.user
super(LectureAdmin, self).save_model(request, lecture, form, change)
allGroups = Group.objects.all()
groups = form.cleaned_data['allowed_groups']
viewright = 'cms.view_lecture'
for ag in allGroups:
if ag in groups:
assign_perm(viewright, ag, lecture)
else:
remove_perm(viewright, ag, lecture)
答
您需要在管理员表单上定义一个save_m2m
方法,并在那里执行自定义关系构建,而不是在模型的保存方法中尝试执行此操作。原因是模型管理员adds a save_m2m
method to your model form并在您的模型窗体上调用调用save
后将其称为,将m2m关系设置为表单中的选择(在第一次保存时其值大概为空)。
好的,谢谢你的快速回答,我会稍后再试! – Magda
@Magda没问题 - 让我知道如果这可以解决问题。 – orokusaki
嘿,感谢您的回答,它真的让我走上了正轨,但最终我最终将模型中的save方法中的东西移动到了我的ModelAdmin中的save_model。在那里我可以访问form.cleaned_data。 – Magda