【超カンタン】django-filterの導入、使い方|コード付

laptop-imgDjango

(最終更新月:2022年3月)

✓Django初心者向けに、こんな考え・お悩みを解決します

「django-filterの使い方が知りたい!」

「とはいっても、新しいライブラリを使うよりも、普通のfilterのほうが良いのかな?」

「一覧ページでフィルター機能を実装したい!」

✓当記事を通じて、下記を徹底解説します

  • 誰でもわかる!django-filterの導入方法・書き方
  • django-filterとは?filterメソッドとここが違う!
  • 機能実装例

【著者プロフィール】

profile_icon
【Python歴】11年 x 【Django歴】10年
HP作成、社内システムの構築、コンサルティング

当ブログを通じて、Webアプリの書き方やアプリの公開方法までを解説しています。

☆日報アプリ「D-Repo」(デモ版)→こちら

※Djangoをベースに作成したアプリです。

☆便利ツールアプリ「Tool Station」→こちら

※Django REST frameworkとReactで作成しているアプリです。

誰でもわかる!django-filterの導入方法、使い方

programming

django-filterの導入

pipでインストールしよう!

pip install django-filter

settings.pyへ追記します

INSTALLED_APPS = [
    ...
    'django_filters',
]

django-filtersの使い方

filters.pyという新たなファイルを作り、そこでフィルタークラスを作成します

【filters.py】

import django_filters

class クラス名(django_filters.FilterSet):
    class Meta:
        model = モデル名
        fields = [
                "モデルフィールド1",
                "モデルフィールド2"
                ]

フォームクラスと非常に似ています

リストビューで新たなコンテキスト「filter」へ下記の通り値を格納します

【views.py】

from .filters import 作成したフィルター

class リストビュー(ListView):
    ...

    def get_context_data(self, *args, **kwargs):
        ctx = super().get_context_data(*args, **kwargs)
        ctx["filter"] = 作成したフィルター(self.request.GET, queryset=self.get_queryset())
        return ctx

get_context_dataメソッドで、

ctx["filter"] = 作成したフィルター(self.request.GET, queryset=self.get_queryset())

とするところがポイントです

コンテキストで渡された「filter」を使ってやることは2つです

【.htmlテンプレート】

①フォームの表示

{{ filter.form.as_p }}

②フィルター結果の表示

フィルターを表示するクエリセットは、

{% for obj in filter.qs %}

{% endfor %}

で表示することができます

django-filterとは?filterメソッドとここが違う!

スポンサーリンク

django-filterを使うと短いコードでfilter機能が実装できます

django-filterでは適用するフィールドの数に関わらず、3つのステップで完了します。

  1. フィルタークラスの作成(filters.py)
  2. フィルターの受け渡し(views.py)
  3. フィルターの展開(.htmlファイル)

日報アプリを例にとると、

  • ユーザー別
  • 公開・非公開
  • 公開日時

などなど思いつく限り様々なフィルタが必要になる可能性があります。

django-filterを使わないとそれぞれのフィールド

  1. フォームを作成
  2. 値を受け取る
  3. フィルタメソッドでソートする
  4. QuerySetを渡す

を繰り返さないといけません。

django-filterライブラリはそんなフォーム作成の手間から、値を受け取りソートする機能まであっという間に構築してくれるのが良いところです。

とはいっても、「生のHTMLで記述することで好きなCSSを適用できる方が良い!」という方がいらっしゃることも理解できます。

ただ別記事でご紹介している通り、pyファイル内でクラス名を書き換えることもカンタンに実装可能です。

確かに最初は少しとっつきにくいかもしれませんが、一度覚えるとより短いコードで実装できるdjango-filterが絶対的にオススメです!

フィルター機能実装事例

complicated

日報アプリでの一例として、公開・非公開で表示を変更するフィルターを作成しました。

ご参考になれば幸いです

【nippo > filters.py】

import django_filters
from nippo.models import NippoModel

public_choices = ((0, "全て"), (1, "公開済のみ"), (2, "ドラフトのみ"))

class NippoModelFilter(django_filters.FilterSet):
    public = django_filters.TypedChoiceFilter(choices=public_choices, method="public_chosen")

    class Meta:
        model = NippoModel
        fields = ["public"]

    def public_chosen(self, queryset, name, value):
        qs = queryset
        if value == "1":
            qs = qs.filter(public=True)
        elif value == "2":
            qs = qs.filter(public=False)
        return qs

【nippo > views.py】※リストビュー内一部抜粋

def get_context_data(self, **kwargs):
    ctx = super().get_context_data(**kwargs)
    ctx["filter"] = NippoModelFilter(self.request.GET, queryset=self.get_queryset())
    return ctx

【nippo > temlates > nippo > nippo-list.html】

☆フォームの表示部分

<form method="GET">
  <div>
   {{ filter.form.public }}
  </div>
  <button type="submit">
    <i class="bi bi-filter-circle"></i>
   </button>
</form>

☆リストの表示部分

{% if filter.qs %}
  <h2>日報一覧</h2>
  {% for obj in filter.qs %}
    <div>ここに表示します</div>
  {% endfor %}
{% else %}
   <div class="nippo-none">保存されている日報はありません</div>
{% endif %}

まとめ

スポンサーリンク

django-filterを使うことで、フィルター機能がカンタンに実装できました

導入方法は、pipを使ってインストール、INSTALLED_APPSへの追記の2点

使い方は、Filterクラスの作成filterの受け渡し展開の3ステップ

とおさえておきましょう

一回で覚えるのも大変かと思いますので、3章の例を参考にいつでも戻ってきてもらえればと思います

少しでも皆様の課題が解決できていれば嬉しく思います

✔ウェブアプリを公開したい方へのおすすめ記事

【保存版】Apache WebサーバーでDjangoアプリを公開
Djangoが公開できる月500円~のレンタルサーバー
【初心者向け】ムームードメインで独自ドメインを取得する3ステップ
【実体験】マイIPの使い方を解説|固定IPアドレスを取得・設定する

✔当ブログは以下のような方に向けて書かれています

「Djangoでのアプリ開発を学びたい!」

「Djangoで開発したアプリをWebで公開するにはどうするの?」

✔当ブログ掲載の記事

  • Djangoで作る日報アプリ開発
  • WebアプリをWeb上に公開する方法
  • Webアプリ開発に必要なそのほかの情報
【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

公式LINEも始めました。記事更新についてや、当ブログ内の人気記事などの情報を定期的に配信しています。

友だち追加

ITCブログにご協力いただける方は、以下もご検討いただけると嬉しいです。

ITCに投げ銭をする

タイトルとURLをコピーしました