Django使用模型实例启动表单字段

时间:2011-09-20 09:41:46

标签: django django-models django-forms django-views

我认为这看起来微不足道,并且感到很惊讶。

我拥有什么

我有一个Django模型+表单(ModelForm)。

我的用户填写表格,在我的观点中,我有通常的说法:

    if request.POST:
        form = myForm(request.POST)
    if request.method == "POST" and form.is_valid():
        result = form.save(commit=False) 

现在我需要重点操作表单的某些字段(在“结果”对象中),我想在保存之前再次检查表单is_valid()

问题

我尝试使用“result”对象(即ModelForm对象)使用字典创建新表单(建议here

result_dictionary = dict((x.name, getattr(result, x.name)) for x in result._meta.fields) 

result_dictionary = model_to_dict(result, fields=[field.name for field in result._meta.fields])

testForm = myForm(initial=result_dictionary)

但它没有通过is_valid()并且没有给出任何错误! 字段传递给新表单...

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

有时,查看Django源代码可能非常有用,这里是BaseForm.is_valid()

def is_valid(self):
    """
    Returns True if the form has no errors. Otherwise, False. If errors are
    being ignored, returns False.
    """
    return self.is_bound and not bool(self.errors)

因此,如果没有错误,is_valid()返回false,因为您没有绑定表单,您没有在任何地方提供表单来查找数据。请尝试使用form.data字典,例如:

if request.POST:
    form = myModel(request.POST)
if request.method == "POST" and form.is_valid():
    form.data['field1'] = 'Changing this'
    form.data['field2'] = 34

    testform = myModel(data=form.data)