在 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 应该是我的朋友吗?
您可以像这样覆盖 BaseFormSet
的 add_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)
我有一个使用 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 应该是我的朋友吗?
您可以像这样覆盖 BaseFormSet
的 add_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)