Проверка ввода пользовательского (мульти) виджета Django

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

  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().

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

Спасибо.


person Community    schedule 17.01.2011    source источник


Ответы (2)


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

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

person konryd    schedule 18.01.2011
comment
Это имеет смысл, если проверка уникальна для экземпляра формы. Однако, если это пользовательский виджет, который всегда требует определенной формы проверки, добавление его вручную в каждую форму, в которой используется этот виджет, нелогично и нарушает DRY. - person Chris Pratt; 02.05.2011

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

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

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

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

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

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

-Виджеты< /а>

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

person Patrick    schedule 14.03.2018