2015年4月28日火曜日

django-table2 を利用して、ソート可能な表を作成する。

django-tables2 は、DB内に格納されたデータを、ページ分割/ソート可能な表形式で容易に出力してくれる。
まず、pip で django-tables2 をインストールする。
pip install django-tables2
model内に格納されたデータを出力するには、対応するtableクラスを作成する。
以下の User クラスのデータを出力する。
[model.py]

class Organization(models.Model):
    organization_id = models.CharField(max_length=5)
    name = models.CharField(max_length=20)

class User(models.Model):
    staff_id = models.CharField(max_length=7)
    name = models.CharField(max_length=15)
    organization = models.ForeignKey(Organization)
まず、出力項目を管理する django_tables2.Table より派生したクラスを作成する。
[tables.py]

import django_tables2 as tables

class UserTable(tables.Table):
    staff_id = tables.Column(accessor="staff_id",
                             verbose_name="STAFF ID",
                             order_by=("staff_id"))
    name = tables.Column(accessor="name",
                         verbose_name="USER NAME",
                         order_by=("name"))
    organization = tables.Column(accessor="organization.name",
                                 verbose_name="ORGANIZATION",
                                 order_by=("organization.organization_id"))

    class Meta:
        attrs = {"class": "paleblue"}
上に記載した Column の引数を説明する。

accessor は、該当項目のデータを管理している model 項目の名称となる。
テーブル内の項目名と一致している場合は省略可能である。
特に外部参照している場合、"参照先.項目名"とする必要がある。

verbose_name は、表上に出力される項目名称である。
また、order_by は、表上のソートボタンを押下された際、何に基づいてソートするかを定義するものである。
当該項目についても、外部参照している場合は、"参照先.項目名"とする必要がある。

表を表示する views.py の例を記載する。
表示対象となるデータを取得する。以下の例では、all によりすべてのデータを取得対象としているが、filter により選択することも可能である。
[views.py]

from django.shortcuts render
from models import User
from tables import UsetTable
from django_tables2.config import RequestConfig

def create_table(request):
    users = User.objects.all()
    table = UserTable(users)
    RequestConfig(request).configure(table)
    return render(request, "people.html", {"table": table})

適当な url により、create_table を呼び出せば、ソート可能な表が出力される。

0 件のコメント:

コメントを投稿