我在Django中使用内联表单集,对于每个显示一个“额外”表单的项,用于添加另一个对象。
现有对象的表单具有"Delete“复选框,用于删除该对象,这很有意义。
但“额外”表单也有这些“删除”复选框...这没有任何意义,因为没有要删除的内容。Django admin中的内联表单不会为“额外”表单显示这些“删除”复选框。
如何删除“额外”内联表单上的这些复选框?
我的模板的内联表单集部分类似于(simplified, full version on GitHub):
{% for bookimage_form in form.forms %}
{% for hidden_field in bookimage_form.hidden_fields %}
{{ hidden_field.errors }}
{% endfor %}
{{ bookimage_form.as_table }}
{% endfor %}下面的"Delete“复选框看起来是多余的:

发布于 2018-03-22 19:07:01
您可以使用InlineModelAdmin类的can_delete设置(TabularInline继承自InlineModelAdmin):
class BookImageInline(admin.TabularInline):
model = BookImage
extra = 1
can_delete = False发布于 2021-04-20 11:46:34
对于Django 3.2+ (link)的更新,你现在可以将can_delete_extra作为False传递给formset_factory,或者它扩展类来从额外的表单中删除复选框
can_delete_extra在Django 3.2中的新特性。
BaseFormSet.can_delete_extra
默认值: True
在设置can_delete=True时,指定can_delete_extra=False将删除删除额外表单的选项。
如果您的Django版本低于3.2,并且不希望升级,请使用以下方法覆盖BaseFormSet:
class CustomFormSetBase(BaseModelFormSet):
def add_fields(self, form, index):
super().add_fields(form, index)
if 'DELETE' in form.fields and form.instance.pk: # check if have instance
form.fields['DELETE'] = forms.BooleanField(
label=_('Delete'),
widget=forms.CheckboxInput(
attrs={
'class': 'form-check-input'
}
),
required=False
)
else:
form.fields.pop('DELETE', None)
YourFormSet = modelformset_factory(
formset=CustomFormSetBase,
can_delete=True,
extra=2
)他们仅用了13年时间就添加了此>.>
发布于 2018-10-15 13:02:44
当你遍历表单时,这里有一种在模板中实现的方法:
{% if bookimage_form.instance.pk %}
<small><b>{{ bookimage_form.DELETE.label_tag }}</b></small><br>
{{ bookimage_form.DELETE}}
{% else %}
{% endif %}不过,您不能使用我不认为的as_table()方法。您必须在表单中表示所有其他字段。
在初始化表单之后,但在进入上下文之前,您可以尝试另一件事:
for f in form.forms:
if not f.instance.pk:
f.fields['DELETE'] = None 不确定这将如何在表格中出现,但您可能可以随意修改这个想法。
https://stackoverflow.com/questions/49426284
复制相似问题