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


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

10-07 19:19
查看更多