【问题标题】:Form.save(commit=False) behaving differently in Django 1.2.3?Form.save(commit=False) 在 Django 1.2.3 中表现不同?
【发布时间】:2010-09-20 21:40:12
【问题描述】:

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

我错过了什么吗?

【问题讨论】:

    标签: python django django-forms pre-commit


    【解决方案1】:

    根据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
    

    这至少应该可以解决问题...

    【讨论】:

    • def clean_ssn(self): ... 自定义清理器的格式为 clean_{{attribute}}。
    • 对,对,我知道。我很快就会修复一个简单的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多