1

在今天之前,我一直在使用 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”参数的目的是允许在保存信息之前对数据进行预处理。

我错过了什么吗?

4

1 回答 1

3

根据该方法的1.2 文档save(),“如果您使用 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

那至少应该解决问题...

于 2010-09-20T23:10:17.237 回答