对于我的应用程序,当通过表单保存模型时,我需要做一些额外的操作。实际上,如果表单中存在某些条件,我需要在另一个模型中添加一个值。
为此,我有两个选择,但是我想了解两者的优缺点。
我目前以这种方式使用后者
def save_model(self, request, obj, form, change):
#some pre save operations....
#this call the save model method
super(MyModelAdmin, self).save_model(request, obj, form, change)
#some post save operations...
它有效
但是我想了解的是:
答案 0 :(得分:1)
我认为您做对了。这可能有助于您了解差异。
当您尝试仅从 django管理员创建或更新内容时,调用save_model
中的 ModelAdmin
方法,但无论位置如何都会触发信号发生动作的地方。这意味着如果您从 django管理员之外的其他地方更改模型,但又从 signals 进行更改,则pre
方法中的post
或save_model
操作将不起作用>既可用于管理员视图之外,也可用于您自定义的编写代码块。
答案 1 :(得分:0)
如果可能的话,我宁愿添加信号来覆盖save_model。信号允许某些发送者通知一组接收者已经采取了某些措施。当许多代码片段可能对同一事件感兴趣时,它们特别有用。它也像event driven programming范式。这有助于使代码组织和清理。
答案 2 :(得分:0)
让我们举一个非常常规的过程示例。我们要注册一个新用户,我们还创建了一个配置文件模型,我们希望仅当保存有效的用户信息时才保存用户的配置文件。
我们可以在Django的管理员中创建一个新用户,并在saved_model
中使用ModelAdmin
方法将表单的其他部分保存到Profile
模型中。这是这样做的“正常”方式。但是使用这种方式,您只能从Django Admin面板访问User和Profile。 Django Admin 外部的“用户注册”表格将不起作用,因为必须注册用户才能访问Django Admin控件。
但是使用post_save
信号,无论您使用Django Admin面板还是保存到User
和Profile
模型的自定义表单,都可以创建和更新新的用户和配置文件
因此,使用信号是最灵活的方法,但是现在您必须确保有一种方法可以验证来自自定义表格的信息。