有一些相关的帖子,但其中没有一个实际上是针对这个问题的。
我试图在我的嵌套Django管理表单中实现一个后保存逻辑。嵌套我的意思是有内联。我已经能够通过覆盖save_model
来实现逻辑,
def save_model(self, request, obj, form, change):
#Added logic here using obj
return super(SomeModelAdmin, self).save_model(request, obj, form, change)
显然,如果在其中一个内联中进行了更改,我的逻辑没有考虑它,因为save_model
仅应用于父对象。我在这个问题上找到了一个Django ticket。它建议应该使用save_related
,因为它现在处理这种问题(请参阅this)。
因此我试过了,
def save_related(self, request, form, formsets, change):
#Added logic here using form.instance
return super(SomeModelAdmin, self).save_related(request, form, formsets, change)
但是我有与上面相同的行为,在使用我的逻辑时似乎没有保存更改。我在这里做错了吗?
修改
以下是一些更多信息。基本上,我在change_form.html
中添加了一个自定义按钮,这是一种自定义方法。所以,
def save_related(self, request, form, formsets, change):
if 'MyButton' in request.POST:
#Added logic here using form.instance
return super(SomeModelAdmin, self).save_related(request, form, formsets, change)
因此,通过这样做,我除了已经包含的内置保存方法之外,还向django admin添加了新的自定义行为。换句话说,该按钮可用于操纵数据并同时保存模型。
现在,我的问题是当触发MyButton
并调用自定义逻辑时,如果有人在其中一个内联中进行了更改,则添加的逻辑不会考虑它,因为它尚未保存在数据库中。
答案 0 :(得分:1)
如果自定义逻辑必须在保存相关对象后发生,则可以在调用super()
方法后执行此操作。
class SomeModelAdmin(ModelAdmin):
def save_related(self, request, *args, **kwargs):
super().save_related(request, *args, **kwargs)
if 'MyButton' in request.POST:
#Added logic here using form.instance
由于您使用的是python 3,因此您不需要将任何参数传递给super()。另外,由于ModelAdmin.save_related
始终返回None
,因此您在save_related
中也不需要返回语句。