在Django中自定义验证ModelField

时间:2010-07-14 22:33:36

标签: django

我的模型看起来像这样:

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”。 (我已经有了可以做到这一点的功能)

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

1 个答案:

答案 0 :(得分: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

此外,有关它所期望的内容以及如何引发验证错误的示例,请查看您正在进行子类化的内容 - 在FloatField中查找site-packages/django/db/models/fields/__init__.py