如何以inlineformset的形式知道哪些是我的默认表单字段,哪些是Django添加的字段?

时间:2019-03-17 12:59:06

标签: django django-forms

我有一个特定的表单集(inlineformset),我想对默认设计进行一些自定义。

我这样循环遍历:

{% for form in formset %}
    <div class="ct-formset">
        {% if form.errors %}<div>{{ form.errors }}</div>{% endif %}
        {% for field in form %}{{ field }}{% endfor %}

 {% endfor %}    

对于Django的每种表单,添加其他两个字段,即外键字段和删除字段。

因为我想对多个表单集使用相同的代码,所以在循环中,我不需要field来请求name

我需要知道:

 {% for field in form %}{{ field }}{% endfor %}

我怎么知道哪些是我的默认表单字段,哪些是Django添加的字段?

1 个答案:

答案 0 :(得分:1)

在使用表单实例时,您无法确定最初在类中还是实例化后添加了哪些字段。

但是,这里有一些方法可以防止那些不想在结果表单集中呈现的字段。

如果您有权访问表单的类...

...目前,您需要“过滤”哪些字段可以采用这种形式的原始字段:

>>> class MyForm(forms.Form):
>>>    title = forms.CharField()

>>> class_dict = vars(MyForm)

>>> class_dict['declared_fields']

OrderedDict([('title', <django.forms.fields.CharField at 0x7f496ce067d0>)])

关于* -DELETE和* -ORDER字段

  

在处理表单集时,必须考虑到不仅Django可以在表单中添加额外的字段,而且还可以这样做。

首先,我们必须了解为什么存在这些字段。

添加*-DELETE*-ORDER字段的大小写,只要您使用以下命令启用它们即可:

formset = formset_factory(..., can_delete=True, can_order=True)

Django使用BaseFormSet.add_fields来添加启用排序或删除所需的其他字段,您也可以使用它来添加自己的其他字段。

你能做什么?

您只需在此处传递False

一个有趣的实验...

我进行了一个实验,以说明覆盖它可能产生的效果:

from django import forms

class MyForm(forms.Form):
    title = forms.CharField()

class MyBaseFormSet(forms.BaseFormSet):
    def add_fields(self, form, i):
        # Avoiding FormSets using this to add additional fields
        return form

# Create a form set with deletion and ordering enabled.
# pay attention to the argument: formset=MyBaseFormSet
MyFormSet  = forms.formset_factory(MyForm, formset=MyBaseFormSet, can_delete=True, can_order=True)

fs = MyFormSet()
for form in fs:
    print(form.as_table())

结果,没有将DELETE或ORDER字段添加到结果表单中。

>>> <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr>

关于ForeignKey

这是您可以在表单中解决的问题。如果您不希望显示ForeignKey,则可以将forms.HiddenInput小部件用于表单中的此类字段。

如果您正在使用ModelForms,则可以select the fields to use来生成表单。

结论

借助此信息,我希望您能够计划如何实现对那些表单集具有通用模板的要求。

起点:

  1. can_delete或/和start_order设置为False到formset_factory
  2. 为表单中的ForeignKey字段设置forms.HiddenInput小部件。
  3. 找到一种获取表单类并使用vars的方法,以找出 表单的原始字段。
  4. 如果您使用的是ModelForms,请使用fieldsexclude元配置以说明用于构建表单的字段。