DjangoAdmin モデル一覧画面で日付の範囲指定を行えるフィルターを実装してみた

はじめに

こんにちは、サイオステクノロジーのあさりです。今回は、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を使って、カレンダー形式で日付の範囲指定を行えるフィルターを実装しました。デフォルトのフィルターに比べて便利で導入も簡単なのでぜひ試してみてください。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です