【问题标题】:Custom validation of a ModelField in DjangoDjango中ModelField的自定义验证
【发布时间】:2010-07-14 22:33:36
【问题描述】:

我的模型如下所示:

class MyModel(models.Model):
    field1 = models.FloatField(default=0)
    field2 = models.FloatField(default=0)

这是它的行为方式:

>>> m = MyModel()
>>> m.full_clean()

>>> m = MyModel(field1=8.9)
>>> m.full_clean()

>>> m = MyModel(field1='')
>>> m.full_clean()
ValidationError: {'field1': [u'This value must be a float.'], ...

我希望它接受空白字符串并让它使用 0。我还希望它接受诸如“5:56”之类的值并让它使用“5.93333”。 (我已经有一个功能可以做到这一点)

目前我正在使用自定义表单字段(而且它很丑陋),但我想将它全部移动以使用模型验证。解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    在您的表单中创建一个clean_field1 函数并在其中验证它。如果不正确,则抛出验证错误,如果是,则重新格式化并返回“正确”值。示例:

    http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

    更新:

    问题已澄清:用户想要一个执行此操作的模型字段。

    覆盖FloatField 以及get_prep_valueto_python 内的例程:

    class MagicalFloatField(FloatField):
      def to_python( self, value_from_db ):
        ...
        return what_should_go_into_model_field_value
      def get_prep_value( self, value_from_field ):
        ...
        return what_should_go_into_db
    

    所以你可以在那里做“5:26”“5.26”。然后在模型中使用您的字段:

    class MagicalModel(Model):
      foo = MagicalFloatField()
    

    参考:

    http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.to_python

    另外,关于它期望什么以及如何引发验证错误的示例,请查看您的子类化 - 在 site-packages/django/db/models/fields/__init__.py 中查找 FloatField

    【讨论】:

    • 我没有使用表单。此外,我不想为使用该字段的每个模型添加 clean_XXX 函数。我想要一个自定义模型字段。
    • 已更新,让我知道它是如何工作的。这应该可以,但我自己之前没有覆盖界面的这个特定部分。
    猜你喜欢
    • 2014-09-08
    • 2012-05-23
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2015-06-16
    相关资源
    最近更新 更多