我有一个特定的表单集(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添加的字段?
答案 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>)])
在处理表单集时,必须考虑到不仅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
,则可以将forms.HiddenInput
小部件用于表单中的此类字段。
如果您正在使用ModelForms,则可以select the fields to use来生成表单。
借助此信息,我希望您能够计划如何实现对那些表单集具有通用模板的要求。
起点:
can_delete
或/和start_order
设置为False到formset_factory
。forms.HiddenInput
小部件。fields
或exclude
元配置以说明用于构建表单的字段。