Администратор django удаляет объекты в строках в методе save_model - PullRequest
3 голосов
/ 23 ноября 2011

У меня есть две связанные (через отношение иностранного) модели и созданная модель администратора для родителя со встроенными.В некоторых случаях (редактируется в admin с помощью логического поля), мне нужно удалить все предыдущие объекты (встроенные) и создать новые.Я попытался сделать это с помощью save_model, где я могу получить все свойства текущего объекта и решить, нужно ли мне воссоздавать (встроенные) объекты.модели:

class Model1(models.Model):
    reformat = models.BooleanField(default=False)
    ...
class Model2(models.Model):
    model1 = ForeignKey(Model1, related_name='model2')
    ...

admin:

class Model2Inline(admin.TabularInline):
    model = Model2

class Model1Admin(admin.ModelAdmin):
    inlines = [Model2Inline]
    def save_model(self, request, obj, form, change):
        super(Model1Admin, self).save_model(request, obj, form, change)
        if obj.reformat:
            obj.model2.all().delete()
            # creating new objects
            ...
        obj.save()

Но если я пытаюсь удалить эти объекты в методе model_save, я получаю ValidationError.Есть ли другие возможности для решения этой проблемы?

1 Ответ

5 голосов
/ 11 января 2012

Я также столкнулся с этой проблемой и, после часа или двух ударившись головой о стену, решил ее, переопределив save_formset() объекта admin вместо save_model() и выполнив необходимые манипуляции после вызоваметод save_formset() суперкласса.Это означает, что модели, которые вы удаляете, все еще присутствуют при сохранении набора форм, поэтому вы не получите ошибку проверки.

Вот как это может выглядеть в приведенном вами примере:

class Model2Inline(admin.TabularInline):
    model = Model2

class Model1Admin(admin.ModelAdmin):
    inlines = [Model2Inline]
    def save_formset(self, request, form, formset, change):
        super(Model1Admin, self).save_formset(request, form, formset, change)
        if formset.model is Model2:
            obj = formset.instance
            if obj.reformat:
                obj.model2.all().delete()
                # creating new objects
                ...
            obj.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...