我的模型看起来像这样:
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”。 (我已经有了可以做到这一点的功能)
目前我使用自定义表单字段(并且它很丑陋),但我想将它全部移动以使用模型验证。什么是最好的解决方法?
答案 0 :(得分:1)
在表单中创建clean_field1
函数并在其中进行验证。如果不正确则抛出验证错误,并重新格式化并返回“正确”值(如果是)。例如:
http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute
更新
澄清问题:用户需要一个模型字段来执行此操作。
覆盖FloatField
以及get_prep_value
和to_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