У меня действительно проблемы с получением моего интерфейса администратора. У меня есть модели и в рамках этой модели в 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)
OK, спасибо за ваш быстрый ответ, я попробую это позже! – Magda
@Magda Нет проблем - сообщите мне, если это исправить проблему. – orokusaki
Эй, спасибо за ваш ответ, это действительно привело меня к правильному пути, но в итоге я просто закончил, переместив материал из метода сохранения в модели на save_model в моем ModelAdmin. Там у меня есть доступ к form.cleaned_data. – Magda