Метод пост-сохранения в админке Django - как это сделать? - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть административная форма с парой строк для отображения полей m2m, например:

class ArticleAdmin(admin.ModelAdmin):
    form = ArticleCustomAdminForm
    inlines = (SpecificGemInline, SuiteInline,)

Базовый класс выглядит примерно так:

class Article(models.Model):
    article_code = models.CharField(max_length=15)
    gems = models.ManyToManyField(Gem, through='SpecificGem')

Модель имеетспециальное поле article_code, которое должно объединять некоторые данные из полей m2m, представленных в обеих строчках, поэтому я написал функцию create_code(instance), которая делает это путем прямого доступа к полям экземпляра модели, что-то вроде этого:

def create_code(instance):
    article_code_part1 = SpecificGem.objects.filter(article=instance)
    article_code_part2 = instance.suite_set.all()
    instance.article_code = #do something with both parts

Проблема в том, что когда я вызываю эту функцию из переопределенных функций save_model() ModelAdmin или save() модели, следование полям экземпляра m2m приводит к устаревшим результатам.Даже отсталый пример, приведенный ниже, не поможет:

class ArticleAdmin(admin.ModelAdmin):
    #...
    def save_model(self, request, obj, form, change):
        obj.save()
        create_code(obj)
        obj.save()

Когда я попадаю в метод clean() InlineFormset, у меня есть доступ к данным его форм, чтобы я мог найти часть article_code даже без фактического сохранения.... но у меня есть две строки.

Итак, как мне найти самый верхний метод сохранения, чтобы я мог вызывать свою функцию агрегирования после того, как все модели проверены и сохранены в db?

1 Ответ

1 голос
/ 30 сентября 2011

Чтобы поймать изменения на ManyToManyField, вам нужно подключить сигнал m2m_changed. Возможно, вы захотите взглянуть на документацию для сигналов в целом и m2m_changed в частности.

...