GoodForms — другой способ рендерить формы в Django

GoodForms — набор темплейт-тегов для Django, которые облегчают генерацию HTML для полей формы. Поле генерируется с помощью темплейт-тега, благодаря чему верстальщик получает полный контроль над его стилем и атрибутами.

Форкнуть

Проблема

Формы в Django слишком много на себя берут. Атрибуты задаются в классе формы и живут отдельно от разметки, а HTML генерируется под капотом фреймворка, без возможности на него повлиять из шаблона.

class LoginForm(forms.Form):
    email = forms.EmailField(attrs={'class': 'input'})
    password = forms.PasswordField(attrs={'class': 'input'})
<form>
  {% csrf_token %}
  <div>Email: {{ form.email }}</div>
  <div>Password: {{ form.password }}</div>
  <button type="submit">Login</button>
</form>

Если в другой части сайта захочется использовать эту-же форму, но с другим набором атрибутов — ничего не получится, придётся городить новый класс, а значит и новую вьюху для обработки экземпляра этого класса.

Решение

В моём мире объекты форм не занимаются генерацией кода, только обработкой и валидацией данных. А сами поля генерируются темплейт-тегами в шаблонах.

{% load form_fields %}
{% form %}
  <div>{% label form.email %}: {% textfield form.email class="input" %}</div>
  <div>{% label form.email %}: {% textfield form.password class="input" %}</div>
  {% submit_button "Login" %}
{% endform %}

В отличии от разметки голым HTML, теги будут сами подхватывать атрибуты типа value и required. Но при этом верстальщик может контролировать их.

Ссылки по теме