2010-10-06 128 views
10

好吧,我一直盯着这几个小时试图弄清楚发生了什么,无济于事。 我想创建一个ModelForm使用'实例'关键字来传递一个现有的模型实例,然后保存它。 这里是的ModelForm(在我试图找出这个问题的原因,从原来的显着剥离):Django ModelForm无法验证,没有错误

class TempRuleFieldForm(ModelForm): 
    class Meta: 
     model = RuleField 

,这里是我运行代码:

>>> m = RuleField.objects.get(pk=1) 
>>> f = TempRuleFieldForm(instance=m) 
>>> f.is_valid() 
False 

的模型对象(上面的m)是有效的,它保存得很好,但表单不会生效。现在,据我所知,此代码与此处找到的Django文档示例相同:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method,但显然我错过了某些内容。我非常感谢一些新的眼睛告诉我我错了什么。

感谢

+2

'f.errors'打印出来什么? – sdolan 2010-10-06 05:53:50

回答

21

请注意,您的链接不调用f.is_valid(),它只是直接节省。这可能有点误导。

的要点是,实例化形式只是一个instance参数,但没有data确实绑定到数据,因此,形式是无效的。你会看到f.is_bound是False。

在幕后,instance实际上与传递initial数据的效果相同,因为这些文档说明仅用于最初显示数据并且不用于保存。您可能会从阅读notes on bound and unbound forms中受益。

+3

+1。 “实例并不意味着绑定”:这是正确的推理。 – 2010-10-06 09:25:09

+0

谢谢,这很有道理。我知道这将是简单的... – oogles 2010-10-07 22:08:32

+0

只是澄清,我使用f.is_valid()的原因只是为了使问题更加简洁。使用f.save()会失败,并在clean_data字段上出现AttributeError,直到表单生效为止,该字段才存在。因此,即使当我使用代码_exactly_(因为它是在我发布的链接中使用f.save()而不是f.is_valid())时,它仍然失败。 – oogles 2010-10-07 22:11:37

3

如果你还想验证数据库中的对象,可以先序列化它,然后用它创建Form。

from django.utils import simplejson 
from django.core.serializers import serialize 

(...) 

fields_dict = simplejson.loads(serialize('json', [obj]))[0]['fields'] 
form = forms.MyForm(fields_dict) 
if form.is_valid 

这可能不是最好的方式来做到这一点,但我发现从模型中获得绑定形式的唯一方法。我需要它,因为我想验证数据库中的当前数据。我创建了一个问题,因为我不认为这是做的最好的方式,这不是OP解决

Transform an unbound form to a bound one?

+2

我错过了整个“将数据绑定到表单”的东西,这就是你在序列化。我相信Django的django.forms.models.model_to_dict会比序列化更好 - 请参阅我的回答你的问题:[link](http://stackoverflow.com/questions/8993749/transform-an-unbound-form-to -a绑定,一个#8996585)。 – oogles 2012-01-25 01:11:23

0

,但它是文章标题,这是相当高的谷歌。所以,无论如何,我会发布它,从here

如果你已经给request.POST使用request.POST or None您的形式,但它仍然是无效的没有错误,请检查没有任何重定向回事。重定向会丢失您的POST数据,并且您的表单将无效,因为它没有绑定。