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 中不起作用?