Значение препроцессора из БД перед отображением в Admin - PullRequest
0 голосов
/ 21 февраля 2012

Мой вопрос очень прост, но мне не удается решить мою проблему: мне нужно обрабатывать поле каждый раз, когда это отображается в админке, потому что его нужно по-разному сохранять в БД.

Например, мне нужно, чтобы пользователь ввел проценты в админке (скажем, 50, 70 или 100), но эти значения будут сохранены в базе данных как 0,5, 0,7 или 1. После, когда пользователь захочет редактироватьили просто посмотрите на эти значения, они не должны быть предварительно обработаны, чтобы снова отобразить их как перцепции (целые числа), даже если они были сохранены как плавающие числа в БД.*

сделает это.Но это сохранение и отображение всех данных неправильно.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Я взял это довольно далеко, получил одну версию вашего кода, которая работает для сохранения, другую, которая работает для отображения. Так что это довольно забавно, но не очень полезно.

Правильное достижение того, что вы хотите:

  1. Используйте простое DecimalField или FloatField в определении класса вашей модели,

  2. Создайте ModelForm для вашей Модели

  3. Определите clean_yourpercentagefield () в вашей ModelForm, чтобы разделить входное значение на 100

  4. Создание и использование пользовательского класса виджетов для умножения значения на 100 перед рендерингом

Как указано в пользовательских полях django и документации модели модели :

вы должны убедиться, что поле формы, используемое для представления вашего настраиваемого поля, выполняет любую проверку ввода и очистку данных, необходимую для преобразования предоставленного пользователем ввода формы в значение поля модели, совместимое с to_python (). Это может потребовать написания пользовательского поля формы и / или реализации метода formfield () для вашего поля, чтобы вернуть класс поля формы, для которого to_python () возвращает правильный тип данных.

Действительно, вы также можете предпринять следующие шаги:

  1. Создание класса PercentageField с переопределением formfield ()

  2. Создать PercentageFormField , который должен вызываться PercentageField.formfield ()

  3. Создать 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 за помощь в этом ответе, который может быть не идеальным, но я подумал, что было бы слишком плохо не поделиться тем, что я нашел.

0 голосов
/ 21 февраля 2012

Попробуйте get_db_prep_value , а затем загляните в БД, чтобы выяснить, на каком этапе происходит сбой.

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