2014-02-17 38 views
1

我真的有讓我的管理界面工作的麻煩。我有一個模型,該模型中的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) 

回答

1

您需要在管理員表單上定義一個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

相關問題