Bootstrapはフロントエンド向けのツールキットです。
BootstrapにはCSSやJavaScriptが用意されていて、ウェブページに組み込む場合は、HTMLタグにclass属性を指定すると、用意されているデザインが適用される、というものです。
メジャーバージョン間で互換性のない変更があり、Bootstrap4(バージョン 4.x)、Bootstrap5(バージョン 5.x)のようにメジャーバージョンの番号付きで呼ばれることがあります。
DjangoでBootstrapを使うには
BootstrapはHTMLタグにclass属性を指定できれば使えるので、DjangoでもテンプレートでCSSとJavaScriptを読み込むように記述すれば使えます。
しかし、DjangoのForm機能を使う場合、inputタグなどのform内で利用するHTMLの文字列生成は、アプリ側のテンプレートではなくDjango内部で行われるので、出力されるタグにclass属性を付与するには少し工夫が必要です。
この記事では説明しませんが以下の方法などがあります。
いくつかある方法のうち、テンプレートタグを使ってDjangoのformの出力内容を変更するアプローチで実装されてるのが django-bootstrap5 です。
django-bootstrap5 24.2 documentation
django-bootstrap5を使うと手軽にBootstrapをDjangoに組み込めます。
インストール
Installation - django-bootstrap5 24.2 documentation
PyPIからインストールできます。
pip install django-bootstrap5
INSTALLED_APPSに django_bootstrap5 を追加します。
INSTALLED_APPS = [
# ...
'django_bootstrap5',
]
INSTALLED_APPSへの追加は、ライブラリ内に含まれるテンプレートファイルや、テンプレートタグを使用するために必要な作業です。
導入
Quickstart - django-bootstrap5 24.2 documentation
ドキュメントからリンクされていますが、exampleのアプリを参考にするとわかりやすかったです。
django-bootstrap5/example at main · zostera/django-bootstrap5 · GitHub
Bootstrapはmetaタグでviewportの指定や、CSSファイル、JavaScriptファイルの読込みが必要になります。
Bootstrap側のドキュメントの通りにlinkタグやscriptタグを直接記述もできますが、django-bootstrap5では、ベースのテンプレートファイルが用意されています。 このファイルを継承して使っておくと、Bootstrapに関する各種設定変更をDjangoのsettings.pyからできるようになるのでおすすめです。
アプリ作成
例として myapp を作ります。
python manage.py startapp myapp
FormとView作成
FormとViewは特にbootstrap5を意識せずに、Djangoのドキュメント通りに作成します。
myapp/forms.py:
from django import forms FAVORITE_COLORS_CHOICES = { "blue": "Blue", "green": "Green", "black": "Black", } class MyForm(forms.Form): name = forms.CharField(label="名前") body = forms.CharField(label="本文", widget=forms.Textarea) favorite_colors = forms.MultipleChoiceField( required=False, widget=forms.CheckboxSelectMultiple, choices=FAVORITE_COLORS_CHOICES, )
myapp/views.py:
from django.views.generic import TemplateView from . import forms class IndexView(TemplateView): template_name = 'index.html' def get_context_data(self): return {'form': forms.MyForm()}
form という名前のコンテキストで index.html にDjango Formのインスタンスを渡しています。
URL設定
サンプルとして作成したプロジェクトは myproject です。 myproject/urls.py にルートのURL設定があります。
作成したIndexViewを有効にしておきます。
myproject/urls.py:
from django.contrib import admin from django.urls import path from myapp import views as myapp_views urlpatterns = [ # ... (省略) path('', myapp_views.IndexView.as_view()), ]
テンプレート作成
この例では myapp/templates ディレクトリ以下にファイルを作っていますが、実際に使用する場合はextendsに指定するテンプレートパスなどとの整合性がとれていれば、ここではなくてもよいです。
myapp/templates/bootstrap.html:
{% extends 'django_bootstrap5/bootstrap5.html' %}
{% block bootstrap5_title %}{% block title %}{% endblock %}{% endblock %}
django-bootstrap5に含まれるテンプレートファイルを継承して、プロジェクト内で使用するbootstrap用のベーステンプレートを作ります。titleブロックを定義しているので、継承したファイルでは bootstrap5_title ブロックを使わずに、 title ブロックで title部分を記載できます。exampleと同様です。
myapp/templates/base.html:
{% extends 'bootstrap.html' %}
{% load django_bootstrap5 %}
{% block bootstrap5_content %}
<div class="container">
<h1>{% block title %}(no title){% endblock %}</h1>
{% autoescape off %}{% bootstrap_messages %}{% endautoescape %}
{% block content %}(no content){% endblock %}
</div>
{% endblock %}
アプリ(プロジェクト)用のベーステンプレートです。各画面はこの base.html を継承して作成する想定です。exampleを参考に必要な部分だけを記載しています。
myapp/templates/index.html:
{% extends 'base.html' %}
{% load django_bootstrap5 %}
{% block title %}
Bootstrap5 フォーム
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{% bootstrap_form form layout=layout size=size %}
{% bootstrap_button button_type="submit" content="OK" %}
{% bootstrap_button button_type="reset" content="Reset" %}
</form>
{% endblock %}
index.htmlでは django-bootstrap5 のテンプレートタグを使用しています。 bootstrap_formタグにformコンテキスト(IndexViewから渡されたMyFormのインスタンス)を渡して、class属性の付与などを行っています。
実行結果
ブラウザで http://127.0.0.1:8000/ にアクセスすると、Bootstrap5のデザインが適用されたフォームが表示されます。

サンプルコード全部
sample_nullpobug/django/django_bootstrap5 at main · tokibito/sample_nullpobug · GitHub