【Django】フォームにBootstrapのスタイルを適用する【django-crispy-forms】

- Python -
2020.02.18
Django

LoginViewのテンプレート(registration/login.html)でログインフォームを表示しようと思った時、公式ドキュメントにある以下赤線部分のフォームで「どうやってBootstrap4のスタイルを適用すればいいんだ?」という問題に直面しました。

<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login">
<input type="hidden" name="next" value="{{ next }}">
</form>

{{ }}内にBootstrap用のクラスを仕込むことができません(class="form-control"など)。

味気ない装いになります↓。

djangoにbootstrap4

調べてみると、django-crispy-formsというパッケージを使うことで簡単にBootstrap4のスタイルを適用したフォーム表示が割と簡単に可能でした。

DjangoのフォームにBootstrap4のスタイルを適用する

以下、パッケージ開発者の公式ドキュメントです。

django-crispy-forms

以下、噛み砕いて使い方を示してくれているブログです。

How to Use Bootstrap 4 Forms With Django

django-crispy-formsの使い方:一例

3ステップで簡単です。Bootstrapのセットアップは終わっているものとします。

① インストールします。

pip install django-crispy-forms

② settings.pyを編集します。以下赤線部分を追加。

INSTALLED_APPS = [
...<省略>...
'crispy_forms',
]
CRISPY_TEMPLATE_PACK = 'bootstrap4'

③ テンプレートで以下のようにcrispy_form_tagをloadしたあと、crispyフィルターをかけます。

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}

{% block content %}

<form method="post" action="{% url 'users:login' %}" class="col-md-8 m-auto">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" value="login">
<input type="hidden" name="next" value="{{ next }}">
</form>

...

{% endblock %}

これだけで、viewから渡されたFormにいい感じにBootstrapが適用されて表示されます。

djangoのフォームにbootstrap4

以下のように、as_crispy_fieldとすることで、フィールド個別に適用することもできます。

{{ form.username|as_crispy_field }}
{{ form.password|as_crispy_field }}

これで間にHTMLタグを好きに挟めるようになるので、より柔軟なスタイリングが可能になります。

<form method="post" novalidate>
{% csrf_token %}
<div class="row">
<div class="col-6">
{{ form.username|as_crispy_field }}
</div>
<div class="col-6">
{{ form.password|as_crispy_field }}
</div>

...

</form>

↑TOP