10

我正在使用 Django 管理员并尝试对映射为InlineModelAdmin对象的相关对象进行一些更改。我正在尝试使用 Django 提供的save_related(self, request, form, formsets, change)方法来做到这一点。当我尝试保存某些内容时,出现错误:

AttributeError: 'AlumniResponseFormFormSet' object has no attribute 'new_objects'

其他信息:

1) 我有两个 InlineModelAdmins
2) 发生此错误时,我没有保存 AlumniResponseInline。我正在保存另一个与同一个父模型关联的 InlineModelAdmin
3) 在我添加 save_related() 方法之前,我在保存 InlineModelAdmin 4) 之前都没有遇到问题4) 在的所有代码在 save_related() 中执行
之后发生此错误,所以我无法控制捕获该异常

save_related()的文档中:

save_related 方法给出了 HttpRequest、父 ModelForm 实例、内联表单集列表和一个基于是否添加或更改父级的布尔值。在这里,您可以对与父对象相关的对象执行任何保存前或保存后操作。请注意,此时父对象及其表单已被保存。

4

1 回答 1

7

我使用save_formset而不是save_related并且我遇到了同样的问题,直到我意识到我错过了方法中的两个重要行:

instances = formset.save(commit=False)

在开始时,然后在循环实例之后对每个实例做一些事情:

instance.save() #commit instance changes
formset.save_m2m() #commit the whole formset changes

在最后。

如果您在返回之前不调用 save_m2m() 方法,则 formset 对象将没有construct_change_message(self, request, form, formsets)contrib/admin/options.py 中的方法所需的 'new_objects' 属性

因此,无论您是否想用它做一些东西,都应该对主模型中的每个内联进行此操作。

于 2014-05-08T09:37:09.287 回答