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

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

はじめに

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

アバター画像
About あさり 6 Articles
サイオステクノロジー2023年新卒入社の新米エンジニアです。

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

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

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


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる