Проверка входных данных пользовательского (мульти) виджета Django - PullRequest
1 голос
/ 18 января 2011

Каков правильный метод проверки ввода для настраиваемого мультивиджета в каждом из этих случаев:

  1. , если я хочу реализовать настраиваемое поле?
  2. , если я хочу использоватьсуществующий тип поля базы данных (скажем, DateField)?

Мотивация для этого исходит из следующих двух вопросов:

  1. Как использовать мультивиджет django?
  2. Мультивиджет с подклассами Django

Меня особенно интересует тот факт, что я чувствую, что меня обманули.Я использовал value_from_datadict() примерно так:

def value_from_datadict(self, data, files, name):

    datelist = [widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)]
    try:   
        D = date(day=int(datelist[0]), month=int(datelist[1]), year=int(datelist[2]))
        return str(D)
    except ValueError:
        return None

, который просматривает словарь POST и создает значение для моего виджета (см. Связанные вопросы).Тем не менее, в то же время я придерживался некоторой проверки;а именно, если создание D как объекта даты завершается неудачно, я возвращаю None, который не пройден при проверке is_valid().

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 марта 2018

Согласно документации, за валидацию отвечает поле за виджетом, а не сам виджет. Виджеты не должны делать ничего, кроме представления входных данных для пользователя и передачи входных данных обратно в поле.

Итак, если вы хотите проверить данные, которые были представлены, вы должны написать валидатор .

Это особенно важно для MultiWidgets, так как вы можете устранить более одного аспекта ошибки данных. Каждый аспект должен быть возвращен пользователю для рассмотрения, и встроенный способ сделать это - написать валидаторы и поместить их в атрибут validators поля.

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

Еще одно замечание: если вы собираетесь реализовать MultiWidget, ваша форма будет передавать какие-то «сжатые» данные обратно для визуализации. Документы говорят:

Этот метод берет одно «сжатое» значение из поля и возвращает список «распакованных» значений. Входное значение можно считать допустимым, но не обязательно непустым.

Виджеты

Просто убедитесь, что вы обрабатываете этот вывод правильно, и все будет в порядке.

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

Вы проверяете поля формы точно так же, как и любые другие поля, внедряя в форму метод clean_fieldname.Если ваша логика проверки распространяется на множество полей формы (что не совпадает со многими виджетами!), Вы помещаете ее в метод clean () формы.

http://docs.djangoproject.com/en/1.2/ref/forms/validation/

...