在 Django 表单集中隐藏 can_delete 字段

hiding can_delete field in a django formset

我有一个使用 formset_factory() 创建的表单集,其中 can_delete 选项设置为 true

在我的 html 模板中,每个表单都显示了 form.as_p 函数,所以我无法访问每个 html 元素

可删除字段被模板显示为复选框,我想隐藏它。

我可以手动呈现表单并修改适当的标签,但由于该表单中有很多字段,似乎有很多代码只是为了隐藏一个元素

我也可以在客户端使用 javascript 或 css,如 here

所述

不过我怀疑可能有更简洁的方法。

我在 doc 中读到还有一个 can_order 字段,它类似于 can_delete,也可以在创建表单集时激活。这个 can_order 字段可以通过创建具有适当属性的表单集 class 来隐藏:

from django.forms import BaseFormSet, formset_factory
from myapp.forms import ArticleForm
class BaseArticleFormSet(BaseFormSet):
    ordering_widget = HiddenInput

ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet, can_order=True)

我想知道是否可以对 can_delete 字段执行类似的操作。像 :

can_delete_widget = HiddenInput

而不是

ordering_widget = HiddenInput

我完全错了,在那种情况下 javascript/css 应该是我的朋友吗?

您可以像这样覆盖 BaseFormSetadd_fields 方法。这也适用于 Django 2.2(ordering_widget 是在 3.0 中添加的):

class MyFormSetBase(BaseFormSet):

    def add_fields(self, form, index):
        """ hide ordering and deletion fields """
        super().add_fields(form, index)
        if 'ORDER' in form.fields:
            form.fields['ORDER'].widget = forms.HiddenInput()
        if 'DELETE' in form.fields:
            form.fields['DELETE'].widget = forms.HiddenInput()

MyFormSet = formset_factory(MyForm, formset=MyFormSetBase, extra=1, can_delete=True, can_order=True)