拥有以下型号:
#models.py
Column(models.Model):
name = models.CharField()
Input(models.Model):
column = ForeignKey(Column)
text = models.CharField()
以下表格:
class InputForm(Modelform):
class Meta():
model=Input
以下作品: c = Column.objects.get(...) I = InputForm({ '列':c.id})
i.is_valid() #true
在我的应用程序中,我生成了许多表单,以避免冲突我前缀:
i=InputForm({'column':c.id}, prefix=prfx()) #prfx() is dynamically generated
i.errors # ({'column':['This field is required']})
i.data['column']
仍然是正确的值
我也尝试过:
i.column = c
i.errors # ({'column':['This field is required']})
如何填充column
字段?
只要不验证
编辑我想要实现的目标:
我正在构建动态表单:
form_list = [InputForm(column, prefix=column.id) for column in col_list]
在模板中,我遍历此表单列表(我想将column
字段设置为不可见。
{% for form in form_list %}
{{form.as_ul}}
{%endfor%}
然后,此表单将由AjaxView处理。 text
和column
之间的关系是通过隐形字段实现的。
答案 0 :(得分:1)
表单的第一个参数是输入数据,通常为request.POST
。如果使用前缀呈现Form
,您将看到所有表单html元素都有一个带前缀的名称,例如<input name='yourprefix_text' />
等。如果您将此类表单发布到Django应用程序,则POSTed数据也会有前缀。
因此,如果您使用前缀,输入数据也需要加前缀:
f = InputForm({'yourprefix_column': c.id}, prefix='yourprefix')
通常,对于默认值的表单use the initial
parameter更好一点,因为否则表单总是被绑定,这会产生一些后果,例如其他字段的默认/初始值将不起作用
f = InputForm(prefix='yourprefix', initial={'column': c})
# or ...
form_list = [InputForm(prefix=column.id, initial={'column': column})
for column in col_list]
如果您希望始终将列设置为以编程方式确定的值,并且不允许用户更改它,最好不在表单中包含该字段,并手动设置字段保存对象后:
f = InputForm(request.POST)
if f.is_valid():
instance = f.save(commit=False)
instance.column = c
instance.save()
要隐藏您的字段,您可以更改窗口小部件as described in the documentation:
class InputForm(ModelForm):
class Meta:
widgets = {
'column': forms.HiddenInput,
}
# ...