今天我开始阅读django.forms
的文档。 API似乎很容易使用,我开始尝试它。然后我开始尝试django.forms.ModelForm
,但我真的不知道我哪里出错了。
我的问题从此处开始:the save method创建form
时instance
。
我的模特是
class Process(models.Model):
key = models.CharField(max_length=32, default="")
name = models.CharField(max_length=30)
path = models.CharField(max_length=215)
author = models.CharField(max_length=100)
canparse = models.NullBooleanField(default=False)
last_exec = models.DateTimeField(null = True)
last_stop = models.DateTimeField(null = True)
last_change = models.DateTimeField(null = True, auto_now=True)
我的表格是
class ProcessForm(ModelForm):
class Meta:
model = Process
fields = ('name', 'path', 'author')
我只想要name
,path
和author
字段,因为在保存模型时会自动设置其他字段。无论如何,在我的测试数据库中,我已经有了条目,并且我选择了一个字段全部设置且有效的字段。
在文档中,您可以阅读:
# Create a form to edit an existing Article.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(instance=a)
>>> f.save()
很好,我想用我自己的代码做同样的事情:
>>> from remusdb.models import Process
>>> from monitor.forms import ProcessForm
>>>
>>> proc = Process.objects.get(name="christ")
>>> pf = ProcessForm(instance=proc)
>>> pf.save()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 364, in save
fail_message, commit, construct=False)
File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 87, in save_instance
save_m2m()
File "/home/shaoran/devpython/lib/python2.6/site-packages/django/forms/models.py", line 78, in save_m2m
cleaned_data = form.cleaned_data
AttributeError: 'ProcessForm' object has no attribute 'cleaned_data'
>>> pf.is_bound
False
>>> pf.is_valid()
False
即使proc
是有效的Process
对象,表单对象似乎也不同意我的看法。如果我做下一个例子
>>> post = { "name": "blabla", "path": "/somewhere", "author": "me" }
>>> pf = ProcessForm(post, instance=proc)
>>> pf.is_bound
True
>>> pf.is_valid()
True
>>> pf.cleaned_data
{'path': u'/somewhere', 'name': u'blabla', 'author': u'me'}
然后它就像文档的第三个例子一样。
我遗漏了什么或文档中是否有错误?或者我的Model
代码有些错误?
这是proc
PROC。的字典 {'name':u'christ','last_stop':datetime.datetime(2012,10,5,16,49,13,630040,tzinfo =),'author':u'unkown','_ state':, 'canparse':False,'last_exec':datetime.datetime(2012,10,5,16,49,8,545626,tzinfo =),'key':u'aed72c9d46d2318b99ffba930a110610','path':u'/ home / shaoran / projects / cascade / remusdb / test / samples / christ.cnf','last_change':datetime.datetime(2012,10,5,16,49,13,631764,tzinfo =),'id':5} < / p>
答案 0 :(得分:1)
表单类的第一个参数是一个字典,其中包含您希望表单验证的值。
由于您从未传递这些值,因此表单无法验证任何输入;这就是cleaned_data
没有的原因。由于.save()
触发了和模型验证,因此表单验证失败。
您会注意到表单实际上没有数据:
af.data
将为{}
(空白字典)
af.is_bound
将为False
(因为您尚未将表单绑定到任何数据)
由于没有数据,验证失败。该错误有点误导。如果你传入一个空的字典:
af = ArticleForm({},instance=a)
af.save()
你会得到一个更合适的错误:
ValueError: The Article could not be changed because the data didn't validate.