Пользовательская проверка ModelField в Django - PullRequest
1 голос
/ 15 июля 2010

моя модель выглядит так:

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 (У меня уже есть функция, которая может сделать это)

В настоящее время у меня это работает с настраиваемым полем формы (и это ужасно, как грех), но я хочу переместить все это, чтобы использовать проверку модели. Какой лучший способ пойти по этому поводу?

1 Ответ

1 голос
/ 15 июля 2010

Сделайте функцию 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...