Django 1.2.3中Form.save(commit=False)行为不同吗?
在今天之前,我一直在使用Django 1.1。为了跟上时代的步伐,我决定把我的Django环境更新到1.2.3版本。不幸的是,我遇到了一个问题。
以下这段代码在1.1版本中没有引发ValueError错误:
instance = FormClass(
request.POST,
instance=existing_instance
).save(commit=False)
但是,现在我升级后,每次运行它都会引发ValueError错误。我有一个社会安全号码(SSN)的字段,我在提交表单之前会把里面的破折号去掉,然后再调用实例的save()方法。不幸的是,ValueError错误出现的原因是Django认为我的SSN值太长了(它期望的是9个字符,但我提供的是11个字符——123-45-6789)。
我查阅了Django的文档,但没有找到与这个变化相关的内容。有人知道这是怎么回事吗?我一直以为“commit=False”这个参数的作用是允许在保存信息之前对数据进行预处理。
我是不是漏掉了什么?
1 个回答
3
根据1.2版本关于save()
方法的文档,如果你在调用save()时设置commit=False,那么它会返回一个还没有保存到数据库的对象。所以我不太明白为什么功能会有变化,但可能在1.1版本时,验证或检查代码只有在对象保存到数据库时才会运行,而在1.2版本中,这个过程发生得更早(在对象保存之前)。
无论如何,如果你在处理表单中输入的数据,最好是在FormClass里进行数据清理:
def clean_ssn(self):
data = re.sub(r'[^0-9]','',self.cleaned_data['ssn'])
#validation code here
return data
这样至少可以解决问题……