Django crispy-forms的model formset如何隐藏自动生成的DELETE列
解决方案
出现DELETE列的根本原因是Django的inlineformset_factory默认开启了删除功能,会自动为每个子表单生成DELETE字段,你使用的crispy-forms内置bootstrap/table_inline_formset.html模板默认会将该字段渲染为独立的列。你可以根据需求选择以下任意一种方案解决:
方案1:直接关闭表单集的删除功能(最推荐)
在视图中创建表单集时添加can_delete=False参数即可从根源上移除DELETE字段,修改views.py中对应代码即可,同时注意修正你现有代码中的几处笔误:
# 原来的代码有笔误:第二个参数应为FooChild,form参数应为FooChildForm,添加can_delete=False self.choice_formset = inlineformset_factory(Foo, FooChild, form=FooChildForm, extra=9, can_delete=False)
修改后表单集不会生成DELETE字段,渲染时自然不会出现对应的列。
方案2:保留删除功能仅隐藏列
如果你后续需要用到删除功能只是不想在当前页面展示该列,可以选择以下任意一种操作:
- 修改
FooChildFormSetHelper配置,添加排除字段规则:class FooChildFormSetHelper(FormHelper): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.form_method = 'post' self.layout = Layout( 'title', ) self.exclude = ['DELETE'] # 新增这行排除DELETE字段 self.render_required_fields = True - 如果上述配置不生效,是因为
bootstrap/table_inline_formset.html模板硬编码了DELETE列的渲染逻辑,你可以将crispy-forms包中该模板复制到你项目的模板目录下,删除模板中所有和DELETE列相关的渲染代码,再将helper的template属性指向你修改后的模板路径即可。
现有代码其他笔误提示
你贴出的代码中还有几处笔误,调整时建议一并修正避免运行报错:
- 视图中实例化helper时写的
ChildFormSetHelper实际类名是FooChildFormSetHelper,需要对应 - 视图
get方法中{{ form|as_crispy_errors }}和{% crispy form %}功能重叠,前者可以删掉 {% crispy formset helper %}已经会自动渲染formset的管理表单,你后面单独写的{{ formset.management_form }}可以删掉避免重复
内容的提问来源于stack exchange,提问作者Homunculus Reticulli
相关产品推荐
相关产品推荐

