レザボア・コンサルティングの中西です。
Django は優れた Web フレームワークですが、大量のデータを表形式で表示する際には、ビューとテンプレートで多くのコーディングが必要になります。
そこで今回は、django-tables2 という強力なライブラリを使って、一覧ページの実装を効率化する方法を紹介します。
前提条件
- Python 3.6 以降がインストールされていること
- pip がインストールされていること
※本記事では上記のインストール手順は解説に含めません。
- 入門記事の内容を実施していること
- 本記事には、入門記事で作成した
sample
以下のソースに手を加えます。
- 本記事には、入門記事で作成した
事前準備
まず、新しいアプリケーションを作成します。
python manage.py startapp table_demo
今回は、この table_demo
アプリケーションで動作確認を行います。
settings.py の INSTALLED_APPS に table_demo
を追加します。
INSTALLED_APPS = [
...
'table_demo',
]
django-tables2 の導入
次に django-tables2
をインストールします。
pip install django-tables2
インストール後、 settings.py の INSTALLED_APPS に django_tables2
を追加します。
INSTALLED_APPS = [
...
'django_tables2',
]
モデルの準備
一覧表示するデータ用のモデルを作成します。
今回は簡単な例として、Person モデルを作成します。
# table_demo/models.py
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
city = models.CharField(max_length=100)
Tableクラスの定義
django_tables2
を画面で表示するには Table クラスを作成し、表示するモデルやフィールドを指定します。
# table_demo/tables.py
import django_tables2 as tables
from .models import Person
class PersonTable(tables.Table):
class Meta:
model = Person
template_name = "django_tables2/bootstrap4.html"
fields = ("name", "age", "city")
ビューの実装
一覧画面を表示するビューを作成します。
# table_demo/views.py
from django_tables2 import SingleTableView
from .models import Person
from .tables import PersonTable
class PersonListView(SingleTableView):
model = Person
table_class = PersonTable
template_name = 'table_demo/person_list.html'
URLとテンプレートの作成
urls.py にPersonListView へのURLパターンを追加します。
# table_demo/urls.py
from django.urls import path
from .views import PersonListView
urlpatterns = [
path('persons/', PersonListView.as_view(), name='person_list'),
]
# sample/urls.py
from django.urls import path, include
urlpatterns = [
...
path('table_demo/', include('table_demo.urls')),
]
また、表示用のテンプレートを作成します。
Bootstrap でデザインを整えます。
<!-- table_demo/templates/table_demo/person_list.html -->
{% load render_table from django_tables2 %}
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
</head>
<body>
<h1>Person List</h1>
{% render_table table %}
</body>
</html>
動作確認①
モデルのマイグレーションを実施しておきます。
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
コマンドでDjangoの開発サーバーを起動し、http://127.0.0.1:8000/table_demo/persons/
にアクセスすると一覧画面が表示されると思います。
テーブルが簡単に表示できましたね。
データ準備
せっかくなので、データを投入してみましょう。
# table_demo/admin.py
from django.contrib import admin
from .models import Person
admin.site.register(Person)
このコードで、管理画面にモデルが反映され、データを直接登録・編集・削除できるようになります。
管理画面にログインするためのスーパーユーザを登録します。
python manage.py createsuperuser
任意のユーザ名・パスワードで登録してください。
登録後は、 http://127.0.0.1:8000/admin/
で管理画面にアクセスできます。
表示名などを整えていないので見栄えは悪いですが、11件のデータを用意してみました。
動作確認②
再度、http://127.0.0.1:8000/table_demo/persons/
にアクセスします。
ちゃんとデータが表示されていますね。
おまけ
ここまでで基本的な紹介をしましたが、django-tables2 には詳細な設定項目がたくさんあり、さまざまなカスタマイズが可能です。
例えば、ページネーションも簡単に実装できます。
tables.py に以下のコードを加えます。
# table_demo/tables.py
import django_tables2 as tables
from .models import Person
class PersonTable(tables.Table):
class Meta:
model = Person
template_name = "django_tables2/bootstrap4.html"
fields = ("name", "age", "city")
per_page = 5 # 1ページに表示する件数を指定
たったこれだけです。
頑張って自分で実装するのもいいですが、効率化可能なところはライブラリの力を借りたいものです。
参考
https://github.com/jieter/django-tables2
おわりに
以上で django-tables2 を使ったシンプルな一覧画面の作成があっという間に完了しました。
Django 開発の効率化のためにぜひ活用してみてください。