Python Django(监护人):根据我的模型中的m2m字段编辑数据

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关系设置为表单中的选择(在第一次保存时其值大概为空)。

+0

好的,谢谢你的快速回答,我会稍后再试! – Magda

+0

@Magda没问题 - 让我知道如果这可以解决问题。 – orokusaki

+0

嘿,感谢您的回答,它真的让我走上了正轨,但最终我最终将模型中的save方法中的东西移动到了我的ModelAdmin中的save_model。在那里我可以访问form.cleaned_data。 – Magda