【问题标题】:Django: overriding to_python() on a ForeignKey field and what other methods are called before clean_<fieldname> when validating a form?Django:在 ForeignKey 字段上覆盖 to_python() 以及在验证表单时在 clean_<fieldname> 之前调用了哪些其他方法?
【发布时间】:2010-01-29 17:27:13
【问题描述】:

我正在尝试解决我在this question 中概述的问题。目前看来我将不得不覆盖 ForeignKey 字段上的 to_python() 方法。但据我在 django 的源代码中看到的,ForeignKey 类实际上并没有声明 to_python() 方法,因此它必须从 Field 类继承它,这意味着它看起来像这样:

def to_python(self, value):
        """
        Converts the input value into the expected Python data type, raising
        django.core.exceptions.ValidationError if the data can't be converted.
        Returns the converted value. Subclasses should override this.
        """
        return value

只有这样是不对的……这意味着它没有抛出 ValidationError。然而,肯定有什么东西一定会抛出它......我的意思是,id 到对象的转换必须在某个地方发生,如果 id 不正确,肯定会抛出 ValidationError 吗? 或者也许正确的问题是在表单上的 clean_&lt;fieldname&gt;() 方法之前调用了哪些其他方法?我可以覆盖其中哪些?

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    to_python 用于在类型不同的情况下将项目从数据库值转换为 Python 值。但外键字段实际上只是一个整数——相关对象的 ID。所以没有必要的转换,因此是空方法。相关对象的实际获取/显示是通过描述符完成的。

    但是,我不知道您为什么认为需要覆盖 ForeignKey 上的 to_python。这与您在链接问题中提到的问题无关,即在链接到它之前必须创建一个对象。最好在表单的 clean 方法中完成,我会在那里添加答案。

    【讨论】:

    • 非常感谢!非常有用的答案:) 我想我可能必须重写 to_python() 方法,因为 django 表单文档说它是表单验证时调用的方法之一。因为我真的对这一切感到困惑(我只覆盖了表单的 clean_ 方法和表单的 clean 方法)我想我得出了错误的结论。再次感谢! :)
    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2015-05-29
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多