Что именно представляют собой виджеты Django?
Я немного запутался в том, что именно представляют собой Django Widgets. От https://docs.djangoproject.com/en/5.1/ref/forms/widgets/:
Виджет обрабатывает рендеринг HTML и извлекает данные из GET/POST-словаря, соответствующего виджету."
Что именно подразумевается под извлечением данных из GET/POST диктанта? Это делается путем передачи аргумента
data
при инстанцировании формы, а как здесь проявляется Widget?Если я правильно понял, виджеты просто создают HTML
<input>
теги, и принимаютattr
параметры, которые задают атрибуты этого тега ввода, а именно: размер (в случае текстового ввода), required (переопределение на поле required value), класс и т.д. Чем же отличаются такие пакеты, какcrispy-forms
+crispy-bootstrap5
,django-bootstrap5
от этих виджетов? И что они делают с виджетами Django? Также в этих пакетах есть параметры при рендеринге поля, где можно изменить css_class (реальный класс ввода). Как это связано с Widget attr['class']?Есть ли в 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.