填充前缀字段 - 错误或功能?

时间:2014-01-05 21:12:42

标签: django django-forms

拥有以下型号:

#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处理。 textcolumn之间的关系是通过隐形字段实现的。

1 个答案:

答案 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,
        }
        # ...