【タレントダッシュボード構築 #5】社員一覧画面をつくる②
今回は検索機能についてまとめていきます。
検索機能はdjango-filterというライブラリを利用して実装します。
詳細は公式ドキュメントをご覧いただきたいのですが、一言でいうと「モデルのフィールドに基づいてクエリセットを絞り込み、その内容をビューに表示する仕組みを提供する機能群」です。
今回例として示した画面では、以下の通り実装しています。
[filters.py]
import django_filters
from django_filters import rest_framework as filters
from django.db import models
from .models import Item
class ItemFilterSet(django_filters.FilterSet):
CH_line = (('1', '部室長等'), ('2', '課長等'), ('3', 'その他'))
code_7 = filters.CharFilter(field_name="code_7", lookup_expr='contains', label="社員コード")
name = filters.CharFilter(field_name="name", lookup_expr='contains', label="氏名")
name_kana = filters.CharFilter(field_name="name_kana", lookup_expr='contains', label="カナ氏名")
honbu = filters.AllValuesMultipleFilter(label="所属本部(複数選択可)")
dept = filters.CharFilter(field_name="dept", lookup_expr='contains', label="所属部室")
kyu = filters.AllValuesMultipleFilter(label="級(複数選択可)")
line = filters.MultipleChoiceFilter(choices=CH_line, label="ライン(複数選択可)")
univ_name = filters.CharFilter(field_name="gakureki__univ_name", lookup_expr='contains', label="出身大学名")
django-filtersではさまざまな絞り込みの方法が定義されています。
今回構築するサイトで利用しているものを中心に、いくつかピックアップし説明します。
※最新・全量については公式ドキュメントをご覧ください。
CharFilter
モデルで定義した項目のうちCharFieldおよびTextFieldに適用できるフィルタです。ルックアップ方法についてはdjango公式ドキュメントをご覧ください。たとえば今回、社員コードや氏名、カナ氏名などを検索する場合には lookup_expr='contains' を指定し、部分一致検索を行っています。
ChoiceFilter
今回構築するサイトでは利用していませんが、複数の選択肢から一つを選んで絞り込みを行う際に利用します。
MultipleChoiceFilter
基本的にはChoiceFilterと同様ですが、読んで字の如くこちらのフィルタでは複数選択することが可能です。
CH_line = (('1', '部室長等'), ('2', '課長等'), ('3', 'その他'))
上記のように、選択肢を宣言してからそれを呼び出すことが一般的です。
AllValuesFilter
ChoiceFilterと類似していますが、こちらのフィルタでは「発生しているデータから選択肢を生成する」という点が異なります。
例えば組織改編に伴って部室名のマスタを修正するというような手間を省くことができ、変更に強いといえます。
AllValuesMultipleFilter
基本的にはAllValuesFilterと同様ですが、読んで字の如くこちらのフィルタでは複数選択することが可能です。
さて、ユーザの入力内容に従って絞り込んだ結果をビューに連携するため、views.pyを以下の通り定義します。
[views.py]
from .filters import ItemFilterSet
"""(略)"""
class ItemFilterView(PermissionRequiredMixin, FilterView):
model = Item
permission_required = ("app.view_item",)
filterset_class = ItemFilterSet
次回からは、社員の詳細情報を表示する画面を構築していきます。
この記事が気に入ったらサポートをしてみませんか?