Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过重写Django Admin中与save_相关的命令来实现后期保存逻辑_Python_Django_Python 3.x_Django Admin - Fatal编程技术网

Python 通过重写Django Admin中与save_相关的命令来实现后期保存逻辑

Python 通过重写Django Admin中与save_相关的命令来实现后期保存逻辑,python,django,python-3.x,django-admin,Python,Django,Python 3.x,Django Admin,有一些相关的帖子,但没有一篇是针对这个问题的 我试图在一个嵌套的Django管理表单中实现一个post save逻辑。嵌套的意思是有内联线。我已经能够通过覆盖save\u model实现逻辑,就像这样 def save_model(self, request, obj, form, change): #Added logic here using obj return super(SomeModelAdmin, self).save_model(request, obj, for

有一些相关的帖子,但没有一篇是针对这个问题的

我试图在一个嵌套的Django管理表单中实现一个post save逻辑。嵌套的意思是有内联线。我已经能够通过覆盖
save\u 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\u model
仅应用于父对象。我在这个问题上找到了一个Django。它建议使用
save\u related
,因为它现在可以处理此类问题(请参阅)

所以我试着,

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\u 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)
因此,通过这样做,除了已经包含的内置saves方法之外,我还向django admin添加了一个新的自定义行为。换句话说,该按钮可用于同时操作数据和保存模型


现在,我的问题是,当<代码> MyButton < /C>被触发并调用自定义逻辑时,如果有人对其中一个内联进行了更改,则逻辑添加后不会考虑它,因为它还没有保存在数据库中。p> 如果自定义逻辑必须在保存相关对象后发生,则只需调用

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\u related
始终返回
None
,因此在
save\u related
中也不需要返回语句。

可以添加更多的代码和示例吗?目前还不清楚预期结果和实际(不想要的)结果是什么。嗯,我能提供的代码不多了。预期结果是在保存表单中存在的所有模型后,在情形1中操纵
obj
,在情形2中操纵
form.instance
(两者相同)。因此,我想跳过正确的保存方法。根据我的发现,在保存所有模型(包括内联实例)后调用了
save_related
。@HåkenLid更新了问题。@HåkenLid您还不清楚吗?
save_related
中的自定义逻辑是什么?如果您包含一个完整的示例,则更容易理解。为什么不先保存相关的(),然后保存自定义逻辑?此方法始终返回
None
,因此不需要显式返回语句。我会接受,因为它可以工作,但如果你能解释一下,那将是一件很糟糕的事情:因为你使用的是python 3,你不需要向super()传递任何参数,为什么你说ModelAdmin.save_related总是返回None,你也不需要save_related中的return语句。在python 3中,你可以调用内置的
super()
不带参数。如果您编写的代码也必须与python2一起使用,则需要使用
super(SomeModelAdmin,self)
调用它。由于即将发布的django版本根本不支持Python2.7,您最好只为Python3.x编写代码。如果您阅读了
ModelAdmin.save_related
的源代码,您会发现它没有
return'语句。它将始终返回
None'。因此,当重写子类中的方法时,也可以返回
None