Добавление произвольных атрибутов HTML в поля Django-формы
Быстрый ответ
В случае, когда необходимо применить к элементам формы в Django произвольные HTML-атрибуты, вы можете воспользоваться следующим кодом:
class MyForm(forms.Form):
    my_field = forms.CharField()
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['my_field'].widget.attrs['data-custom'] = 'value'
После этого поле my_field будет оснащено атрибутом data-custom="value".

Основы настройки атрибутов виджета
Добавление атрибутов к полям формы расширяет их функциональность. Например, чтобы задать класс или отключить автозаполнение, используйте следующий код:
Добавляем класс к полю:
self.fields['my_field'].widget.attrs.update({'class': 'my-css-class'})
Отключаем автозаполнение:
self.fields['my_field'].widget.attrs.update({'autocomplete': 'off'})
Присваиваем атрибуты динамически:
if some_condition:
    self.fields['my_field'].widget.attrs['data-condition'] = 'true'
else:
    self.fields['my_field'].widget.attrs['data-condition'] = 'false'
Работа с модельными формами
Для изменения ModelForm рекомендуется задавать виджеты внутри внутреннего класса Meta:
class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['my_field']
        widgets = {
            'my_field': forms.TextInput(attrs={'autocomplete': 'off', 'class': 'my-class'})
        }
Теперь my_field содержит атрибуты autocomplete="off" и class="my-class".
Время для магии: django-widget-tweaks
С помощью библиотеки django-widget-tweaks, вы сможете управлять атрибутами полей прямо в шаблоне:
{% load widget_tweaks %}
{{ form.my_field|add_class:"my-css-class" }}
{{ form.my_field|attr:"data-custom:value" }}
Распространенные ошибки и пути их обхода
Важно избегать следующих типичных ошибок при работе с HTML-атрибутами:
- Используйте метод 
.update(), чтобы не перезаписывать уже существующие атрибуты. - Проверьте, нет ли конфликтов между CSS-классами.
 - Помните о том, что браузеры могут кешировать формы и ваши изменения не отобразятся до очистки кеша.
 
Визуализация
Процесс добавления атрибутов к полям формы можно визуализировать как наполнение книги (📘) ключевыми словами (🔑) и главами:
form.fields['my_field'].widget.attrs.update({'class': 'my-css-class',
                                             'placeholder': 'Введите текст...',
                                             'data-toggle': 'my-info'})
Таким образом, ваша книга обретет свой уникальный стиль:
📘<input class="my-css-class" placeholder="Введите текст..." data-toggle="my-data-info">
Поля формы теперь более наглядно передают пользователю уникальные характеристики.
Полезные материалы
- Виджеты | Django Documentation — здесь вы найдете подробную информацию по настройке виджетов форм в Django.
 - GitHub – jazzband/django-widget-tweaks — инструмент для управления атрибутами и классами в шаблонах.
 - Поля формы | Django Documentation — обзор методов модификации форм и виджетов.
 - Документация django-crispy-forms 2.0 — рекомендации по optически приятному и удобному отображению форм.
 - Django Passing Custom Form Parameters to Formset – Stack Overflow — обсуждение методов передачи параметров в формсеты.
 - Формы Django · Набор учебных материалов Django — подробное руководство о включении наследования шаблонов и использовании 
{{ form.as_p }}в Django. 


