formset 删除内联实例

Posted

技术标签:

【中文标题】formset 删除内联实例【英文标题】:formset delete inline instance 【发布时间】:2016-08-04 03:28:28 【问题描述】:

已确定我需要从表单集中删除的对象。

def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in instances:
            ......
        if formset.deleted_forms:
            for obj in formset.deleted_forms:
               obj.delete() //here is the issue

它以错误结束

*** AttributeError: 'ActivitiesForm' object has no attribute 'delete'

这就是 formset.deleted_forms 是什么

(Pdb) formset.deleted_forms
[<django.forms.widgets.ActivitiesForm object at 0x7f19f6435f50>]

这里出了什么问题?基本上我正在尝试删除从管理员中选择的内联条目

【问题讨论】:

显然该对象没有delete 方法,但我不确定您到底想要实现什么。 假设您已经上传了一个内联表格内容。你想删除它!当我们覆盖 save_formset() 时。我们如何处理? 【参考方案1】:

如果您使用的是模型表单集,您应该循环通过deleted_objects,而不是deleted_forms。请参阅the docs 了解更多信息。

for obj in formset.deleted_objects:
    obj.delete()

请注意,在 Django 1.7 (release notes) 之前,您不需要手动删除对象。当您调用 save() 时,对象已被删除,即使使用 commit=False

【讨论】:

formset.deleted_objects 不退出 (Pdb) formset.deleted_forms [] (Pdb) formset.deleted_objects *** AttributeError: 'ActivitiesFormFormSet' 对象没有属性 'deleted_objects' 看起来你可能使用的是旧版本的 Django。 django 1.7 是我正在使用的 在这种情况下,我不知道您为什么收到AttributeError。希望你能弄清楚。 @surfer190 这是不正确的。 The docs 表明 deleted_objectsModelFormSet 的一个功能,它们与管理员无关。【参考方案2】:

在 Django >=1.11 中,您可以覆盖表单集上的删除:

class YourInlineFormset(BaseInlineFormSet):

    def delete_existing(self, obj, commit=True):
        if commit:
            do_delete_it_your_way()

【讨论】:

以上是关于formset 删除内联实例的主要内容,如果未能解决你的问题,请参考以下文章

在模板中访问内联表单集的父级?

Django:如何更改内联表单集中的字段小部件

Django - 基数为 10 的 int() 的 Formset 无效文字:''

django InlineFormsets错误报告,其中formset错误列表为空

iframe 内联框架

实例化内联表单集时指定查询集