Как мне преобразовать входные данные из формы Django в данные Python? - PullRequest
0 голосов
/ 17 января 2011

У меня есть виджет, который позволяет пользователю вводить данные для поля модели.Данные в форме не могут быть непосредственно преобразованы в Python - это требует некоторого принуждения.Где я могу разместить этот код?Отвечает ли виджет за перевод своих post данных в значение Python?Само поле?

Я подумал, что, возможно, value_from_datadict() будет правильным, но теперь, похоже, это служит другой цели.

(я использую форму в интерфейсе администратора,если это что-то меняет.)

Обновление @AndiDog: Я не уверен, что to_python - это то, что я хочу.Из источника Django:

135     def to_python(self, value):
136         """
137         Converts the input value into the expected Python data type, raising
138         django.core.exceptions.ValidationError if the data can't be converted.
139         Returns the converted value. Subclasses should override this.
140         """
141         return value

Вы говорите, что это вызвано, когда value является POST данными из формы?Я вставил оператор печати, и value - это None при отправке формы, даже если на входе есть данные.

Обновление 2 : На самом деле это выглядит как value_from_datadictэто путьИмеется словарь от имен входов до их значений.

Ответы [ 2 ]

1 голос
/ 18 января 2011

Цитирование источника django для value_from_datadict():

Если дан словарь данных и имя этого виджета, возвращает значение этого виджета.Возвращает None, если не предоставлено.

Не совсем понятно, для чего предназначена эта функция.Его цель - вернуть значение для этого виджета на основе всего словаря опубликованных данных;а именно, он просматривает эти данные, обрабатывает данный экземпляр виджета, данные которого принадлежат ему, и возвращает его.

Я проверил это, разбив свой собственный виджет с тщательно помещенным raise исключением.

File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in is_valid
  121.         return self.is_bound and not bool(self.errors)
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in _get_errors
  112.             self.full_clean()
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in full_clean
  267.         self._clean_fields()
File "/usr/lib/python2.7/site-packages/django/forms/forms.py" in _clean_fields
  278.             value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))

Хотите подтвердить здесь?Я использовал подкласс мультивиджетов, но это не обязательно лучший подход.Мой метод восстанавливает дату из словаря, пытается создать объект даты Python из него.Если это удается, он преобразует его в строку и возвращает то, что является допустимым;если это не так, он возвращает None, что не проходит проверку в базе данных для типа DateField(), чего я и хотел.

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

Refs:

1 голос
/ 18 января 2011

За это отвечают методы clean и clean_<field> в подклассе Form.Вот документы о проверке (и очистке): http://docs.djangoproject.com/en/1.2/ref/forms/validation/

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