通过覆盖Django Admin

时间:2017-10-30 15:58:11

标签: python django python-3.x django-admin

有一些相关的帖子,但其中没有一个实际上是针对这个问题的。

我试图在我的嵌套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并调用自定义逻辑时,如果有人在其中一个内联中进行了更改,则添加的逻辑不会考虑它,因为它尚未保存在数据库中。

1 个答案:

答案 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中也不需要返回语句。