django admin 在 save_model 方法中删除内联对象

Posted

技术标签:

【中文标题】django admin 在 save_model 方法中删除内联对象【英文标题】:django admin delete objects in inlines in save_model method 【发布时间】:2012-01-04 17:37:59 【问题描述】:

我有两个相关的(通过外键关系)模型,并为具有内联的父级创建了管理模型。在几种情况下(由布尔字段在管理员中编辑),我需要删除所有以前的对象(内联)并创建新对象。我尝试使用 save_model 来实现它,我可以在其中获取所有当前对象的属性并决定是否需要重新创建(内联)对象。 型号:

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

管理员:

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。 有没有其他方法可以解决这个问题?

【问题讨论】:

ValidationError 没有从那里提出。你的模型上有clean 方法吗?如果是这样,也发布该代码。否则,您的代码在到达save_model 之前就被挂断了,所以请发布您正在使用的任何表单。 不,没有定义 clean() 方法。我决定存在问题,因为如果我用 delete() 注释行,它会按预期工作,但它也会保存以前的对象(我不想要)。 我决定尝试使用信号。使用 save_model 方法对管理模型进行一些更改,并在 pre_save 或 post_save 信号中处理存储的主要部分。 【参考方案1】:

我也遇到了这个问题,在我的头撞到墙上一两个小时后,通过在管理对象上覆盖 save_formset() 而不是 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()

【讨论】:

我不得不删除 'save_formset(self, request, form, formset, change)'中的 'self'

以上是关于django admin 在 save_model 方法中删除内联对象的主要内容,如果未能解决你的问题,请参考以下文章

Django admin save_model 没有在 Postgres 中推进主键

覆盖 Django InlineModelAdmin 上的 save_model

为啥 save_model 方法在 admin.StackedInline 中不起作用?

在 django 中测试 admin.ModelAdmin

Django Admin Cookbook-40如何为Django Admin覆盖保存操作

Django Admin Cookbook-24如何从两个不同的模型创建一个Django Admin后台页面