2014-02-17 10 views
1

У меня действительно проблемы с получением моего интерфейса администратора. У меня есть модели и в рамках этой модели в M2M-поле для группы:Python Django (Guardian): редактирование данных в зависимости от 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 сигнал, но проблема в том, что я всегда нажать на кнопку Сохранить в моем админ-интерфейс дважды, чтобы произошли какие-либо изменения. (Группы всегда добавляются правильно, но разрешения добавляются только во второй раз, когда модель сохраняется с помощью кнопки сохранения в интерфейсе администратора). Что здесь происходит? Может ли кто-нибудь помочь?

--- EDIT ---

Мое решение: я переместил разрешение присваивание-кода в моем классе 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 в вашей форме администратора и выполнить ваше собственное построение отношений, а не пытаться сделать это в методе сохранения модели. Причина этого заключается в том, что модель admin adds a save_m2m method to your model form и называет ее после, вызывая save в вашей модели, устанавливая отношения m2m к выборам в форме (значение которой предположительно пуст после первого сохранения).

+0

OK, спасибо за ваш быстрый ответ, я попробую это позже! – Magda

+0

@Magda Нет проблем - сообщите мне, если это исправить проблему. – orokusaki

+0

Эй, спасибо за ваш ответ, это действительно привело меня к правильному пути, но в итоге я просто закончил, переместив материал из метода сохранения в модели на save_model в моем ModelAdmin. Там у меня есть доступ к form.cleaned_data. – Magda