Form.save(commit = False)在Django 1.2.3中表现不同?

时间:2010-09-20 21:40:13

标签: python django django-forms pre-commit

在今天之前,我一直在使用Django 1.1。为了确保我跟上时代的步伐,我决定更新我的Django环境以使用Django 1.2.3。不幸的是,我遇到了一个问题。

以下代码未在1.1中引发ValueError:

        instance = FormClass(
            request.POST,
            instance=existing_instance
        ).save(commit=False)

但是,现在我已经升级了,每次都会引发一个ValueError。我有一个SSN字段,我作为我的表单的一部分提交,我在执行instance.save()调用之前删除了破折号。不幸的是,出现ValueError是因为Django认为我的SSN值太长(它预计有9个字符,并且它正在接收11 - 123-45-6789)。

我查看了Django文档,但找不到与此更改有关的任何内容。知道发生了什么事吗?我一直认为“commit = False”参数的目的是允许在保存信息之前预处理数据。

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

根据1.2 docs on the save() method,“如果使用commit = False调用save(),则它将返回尚未保存到数据库的对象。”所以我不确定为什么会出现功能上的变化,但是1.1验证/检查代码可能仅在对象保存到数据库时运行,而在1.2中它早于(在保存对象之前)

在任何情况下,如果您正在清理表单中输入的数据,您可能应该在FormClass中清除它:

def clean_ssn(self):
    data = re.sub(r'[^0-9]','',self.cleaned_data['ssn'])
    #validation code here
    return data

至少应该解决这个问题......