Я взял это довольно далеко, получил одну версию вашего кода, которая работает для сохранения, другую, которая работает для отображения. Так что это довольно забавно, но не очень полезно.
Правильное достижение того, что вы хотите:
Используйте простое DecimalField или FloatField в определении класса вашей модели,
Создайте ModelForm для вашей Модели
Определите clean_yourpercentagefield () в вашей ModelForm, чтобы разделить входное значение на 100
Создание и использование пользовательского класса виджетов для умножения значения на 100 перед рендерингом
Как указано в пользовательских полях django и документации модели модели :
вы должны убедиться, что поле формы, используемое для представления вашего настраиваемого поля, выполняет любую проверку ввода и очистку данных, необходимую для преобразования предоставленного пользователем ввода формы в значение поля модели, совместимое с to_python (). Это может потребовать написания пользовательского поля формы и / или реализации метода formfield () для вашего поля, чтобы вернуть класс поля формы, для которого to_python () возвращает правильный тип данных.
Действительно, вы также можете предпринять следующие шаги:
Создание класса PercentageField с переопределением formfield ()
Создать PercentageFormField , который должен вызываться PercentageField.formfield ()
Создать PercentageWidget , который PercentageFormField будет использовать по умолчанию
Ошибка, с которой вы столкнетесь, если вы намерены сделать это так, как вы предлагали, что неверно, заключается в том, что to_python () вызывается несколько раз снова и снова, в основном с этим кодом:
def to_python(self, value):
print 'to python', value
value = None if value is None else int(100 * value)consider this section of the documentation
print 'converted to python', value
return value
При сохранении модели из формы модели будет выведено что-то вроде:
to python 32.0
converted to python 3200
clean 3200
to python 3200
converted to python 320000
Вы должны использовать SubFieldMetaclass , если вы настаиваете на том, что хотите сделать это неправильно.
Заключение: KISS FTW !
Благодарность SmileyChris за помощь в этом ответе, который может быть не идеальным, но я подумал, что было бы слишком плохо не поделиться тем, что я нашел.