Django 1.2.3中Form.save(commit=False)行为不同吗?

1 投票
1 回答
1057 浏览
提问于 2025-04-16 04:23

在今天之前,我一直在使用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

这样至少可以解决问题……

撰写回答