Я думаю, что рендеринг HTML-формы для вас — это одно из самых больших удобств Django.
Недостатком является то, что структура сгенерированной формы не настраивается. Если у вас специфический дизайн и вам нужно разместить входы в другом месте, Django дает вам возможность отрисовать каждый элемент отдельно на уровне элемента управления вводом следующим образом:
<div class="fieldWrapper">
{{ form.subject.errors }}
<label for="{{ form.subject.id_for_label }}">Subject:</label>
{{ form.subject }}
</div>
template.html
Но проблема настройки все еще остается: вы не можете задать пользовательские классы для отдельных элементов управления вводом. {{ form.subject }}
отобразит элемент управления вводом, не давая вам возможности установить пользовательский класс.
Это проблематично, поскольку большинство CSS-фреймворков (например, Bootstrap, Bulma) требуют установки определенных классов для элементов управления вводом, чтобы стилизовать их соответствующим образом.
Одним из решений является установка этих классов в объекте Form
:
class ExampleForm(forms.Form):
subject = forms.CharField(
widget=forms.TextInput(attrs={'class':'input-text'}))
enabled = forms.BooleanField(
widget=forms.TextInput(attrs={'class':'input-checkbox'}))
forms.py
Но, на мой взгляд, это создает другую проблему. Объект Form
должен моделировать форму с ее типами данных входов и любыми другими требованиями бизнес-логики. Он не должен отвечать за стилизацию и другие визуальные атрибуты. Местом для таких инструкций по стилизации является шаблон.
К сожалению, я думаю, что в Django нет встроенного способа сделать это без использования внешней библиотеки. Но не бойтесь. Существует небольшая и легкая библиотека, которая делает именно это, называется django-widget-tweaks.
С помощью этой библиотеки вы можете установить пользовательские CSS-классы (и многое другое) для ваших элементов управления вводом, и вы можете установить это в шаблоне, где логически находится все позиционирование и стилизация формы:
{% load widget_tweaks %}
<div class="fieldWrapper">
{{ form.subject.errors }}
<label for="{{ form.subject.id_for_label }}">Subject:</label>
{{ form.subject|add_class:"input-text" }}
</div>
<div class="fieldWrapper">
{{ form.enabled.errors }}
<label for="{{ form.enabled.id_for_label }}">Enabled:</label>
{{ form.enabled|add_class:"input-checkbox" }}
</div>
template.html
Библиотека предлагает довольно много других возможностей по настройке элементов управления формой. Если это вызвало у вас интерес, посмотрите!
Надеюсь, вы узнали способ настройки форм Django без смешивания инструкций по стилизации в модели Form
.
Счастливого кодинга!