はじめに
こんにちは、サイオステクノロジーのあさりです。今回は、django-admin-rangefilterというパッケージを使って、DjangoAdminのモデル一覧画面でカレンダー形式での日付の範囲指定を行えるフィルターを実装する方法を紹介します。
環境
- Python3
- Django4.2
- django-admin-rangefilter 0.10.0
DjangoAdminのフィルター機能について
DjangoAdminでは、以下のようにlist_filterでフィールドを指定するとそのフィールドに基づいた絞り込みが可能になります。今回は、例としてこちらの記事で作成したAccessLogモデルを使用します。
# accesslog/admin.py
from django.contrib import admin
from .models import AccessLog
class AccessLogAdmin(admin.ModelAdmin):
list_display = ('access_date_time', 'request_url', 'request_method',)
list_filter = ('access_date_time',) #フィルター機能を利用するフィールドの指定
admin.site.register(AccessLog, AccessLogAdmin)
list_filterの設定完了後に次のコマンドでサーバーを立ち上げて、どのようなフィルターが実装されているか確認してみましょう。
python3 manage.py runserver
アクセスログの一覧画面を確認すると以下のようなフィルターが実装されていると思います。
list_filterに指定したaccess_date_timeフィールドはDateTimeFieldで定義されており、DateTimeFieldに対しては画像のような5つの選択肢を持つフィルターが実装されるようです。しかし、このデフォルトのフィルターでは先月や昨年のデータの絞り込みを行いたいときに不便だなと感じます。
そこでdjango-admin-rangefilterというパッケージを導入して、日付を範囲指定して絞り込みを行えるフィルターを実装したいと思います。
django-admin-rangefilterによるフィルターの実装
パッケージのインストール
まずは、パッケージをインストールしましょう。
pip install django-admin-rangefilter
設定ファイルに追加
次に、インストールしたパッケージをプロジェクト内で有効化するために設定ファイルのINSTALLED_APPSにrangefilterを追加します。
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'accesslog',
'rangefilter',
]
フィルターの実装
rangefilterを使って、access_date_timeについてカレンダー形式で日付の範囲指定を行えるフィルターを実装するには、admin.pyを次のように編集してください。
# accesslog/admin.py
from django.contrib import admin
from rangefilter.filters import DateRangeFilter
from .models import AccessLog
class AccessLogAdmin(admin.ModelAdmin):
list_display = ('access_date_time', 'request_url', 'request_method',)
list_filter = (('access_date_time', DateRangeFilter),) #フィルター機能を利用するフィールドの指定
admin.site.register(AccessLog, AccessLogAdmin)
実装はこれで完了です。
動作確認
サーバーを立ち上げて、フィルターが実装できているか確かめてみましょう。
カレンダーアイコンから開始日と終了日の指定ができ、検索ボタンとリセットボタンも実装されていると思います。
おわりに
今回は、django-admin-rangefilterを使って、カレンダー形式で日付の範囲指定を行えるフィルターを実装しました。デフォルトのフィルターに比べて便利で導入も簡単なのでぜひ試してみてください。