Что именно представляют собой виджеты Django?

Я немного запутался в том, что именно представляют собой Django Widgets. От https://docs.djangoproject.com/en/5.1/ref/forms/widgets/:

Виджет обрабатывает рендеринг HTML и извлекает данные из GET/POST-словаря, соответствующего виджету."

  1. Что именно подразумевается под извлечением данных из GET/POST диктанта? Это делается путем передачи аргумента data при инстанцировании формы, а как здесь проявляется Widget?

  2. Если я правильно понял, виджеты просто создают HTML <input> теги, и принимают attr параметры, которые задают атрибуты этого тега ввода, а именно: размер (в случае текстового ввода), required (переопределение на поле required value), класс и т.д. Чем же отличаются такие пакеты, как crispy-forms+crispy-bootstrap5, django-bootstrap5 от этих виджетов? И что они делают с виджетами Django? Также в этих пакетах есть параметры при рендеринге поля, где можно изменить css_class (реальный класс ввода). Как это связано с Widget attr['class']?

  3. Есть ли в Django шаблоны для каждого виджета в файлах (как и остальные шаблоны в системе шаблонов Django)?

Что именно подразумевается под извлечением данных из GET/POST dict? Это делается путем передачи аргумента data при инстанцировании формы, как здесь появляется Widget?

Indeed, you pass the data to a form. But a form is, essentially, just a group of form fields (ok, this is a bit an oversimplification). The form itself does not have logic to extract the date from a DateTimeField form field [Django-doc].

По сути, происходит следующее: форма перечисляет все поля формы с полученными данными, поэтому каждое поле формы может попытаться найти эти данные и обработать их соответствующим образом.

Поле формы также не умеет извлекать данные из HTML. Поле формы работает с виджетом или несколькими виджетами. Виджеты служат двум целям: отображают HTML для HTML-формы и извлекают данные из этих HTML-элементов в виде простых значений.

Поле формы затем может объединить значения, определенные в виджете, в объект Python, который поле формы должно генерировать, а также выполнить некоторую проверку.

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

Так чем же такие пакеты, как crispy-forms+crispy-bootstrap5, django-bootstrap5 отличаются от этих виджетов?

Эти инструменты изменяют процесс рендеринга. Например, добавляя дополнительные атрибуты к уже определенным виджетам, или изменяя способ рендеринга всей формы вместе: форма в Django рендерится путем перечисления полей формы, затем поля формы рендерятся (по логике, предоставляемой виджетами этих полей формы) и объединяются. Можно предоставить другой шаблон или использовать более сложную логику для объединения HTML, генерируемого виджетами.

Есть ли в Django шаблоны для каждого виджета в файлах (как и остальные шаблоны в системе шаблонов Django)?

Yes, although the template are often not very fancy. This is the template [GitHub] for example is one for the TextInput [Django-doc] widget. You can override a template to thus change how an already existing widget is rendered.

Вернуться на верх