首页 > 解决方案 > 在 Django 表单集中隐藏 can_delete 字段

问题描述

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

在我的 html 模板中,每个表单都使用 form.as_p 函数显示,因此我无法访问每个 html 元素

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

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

我也可以在客户端使用 javascript 或 css,如此处所述

但是我怀疑可能有一种更简洁的方法来做到这一点。

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

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应该是我的朋友吗?

标签: djangofieldhideformset

解决方案


您可以覆盖这样的add_fields方法BaseFormSet。这也适用于 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)

推荐阅读