Django

Django カスタムテンプレートフィルターの作成・テスト・配布方法

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

1. Django テンプレートエンジンが提供する基本機能

テンプレートは文字列置換や簡易演算に限定された DSL(Domain Specific Language)です。ロジックはビュー側で処理し、結果だけを渡すことで 「表示ロジックはテンプレート、ビジネスロジックはビュー」 という役割分担が保たれます。この設計は保守性とセキュリティの両立に寄与します。

1‑1. ビルトインフィルターだけでは足りないケース

標準で用意されている dateuppertruncatechars といったフィルターは汎用的ですが、実務では以下のような要件が頻出します。

  • 日本語ローカライズされた日付書式(例:2023年04月01日
  • 文字列中の特定キーワードを HTML マークアップで強調
  • 複数フィールドを組み合わせた独自フォーマット

これらは カスタムフィルター を作成すればテンプレート側の記述がシンプルになり、ビューコードとテンプレートコードの境界が明確になります。


2. カスタムフィルターパッケージのディレクトリ構成

Django は app_name/templatetags/ ディレクトリ配下に置かれたモジュールを自動的に検出し、 {% load module_name %} で利用可能にします。以下は推奨される最低限の構成例です。

  • __init__.py が無いと Python パッケージとして認識されず、インポートエラーになります。
  • モジュール名はファイル名(拡張子除く)になるので、custom_filters.py を作成したらテンプレート側では {% load custom_filters %} と記述します。

3. カスタムフィルターの実装とエスケープ制御

3‑1. 基本的な登録手順

django.template.Library のインスタンスを作成し、デコレータで関数を登録します。以下は最小構成です。

3‑2. 単純な変換フィルター(例:日本語日付)

@register.filter(name='ja_date') と書くと、テンプレート上で |ja_date が使用可能になります。

3‑3. エスケープ制御の正しい書き方

Django のテンプレートエンジンは自動エスケープがデフォルトで有効です。出力が安全(HTML が既にエスケープ済み)な場合は is_safe=True を付与し、逆に手動でエスケープ処理を行う必要があるときは needs_autoescape=True を指定します。

3‑3‑1. 手動エスケープが不要な例(安全マークアップ)

3‑3‑2. 手動エスケープが必要な例(自前の文字列置換)

  • needs_autoescape=True が付いていると、テンプレート側で自動エスケープが有効な場合は第 3 引数に True が渡されます。
  • エスケープ済みの文字列を再度エスケープしないよう注意してください。

3‑4. フィルター実装時のベストプラクティス

項目 推奨内容
引数の型チェック isinstance で受け取る型を限定し、期待外れの場合は元値を返す
ドキュメンテーション文字列 必ず """...""" で説明を書き、テンプレートタグ生成ツールが参照できるようにする
テスト容易性 純粋関数として実装し、副作用(DBアクセス等)を持たせない

4. テンプレート側でのカスタムフィルター利用例

4‑1. フィルターのロード方法

テンプレートの先頭に以下を記述すれば、同ディレクトリ内の全てのフィルターが使用可能です。

4‑2. 実装例:日付と文字列省略

4‑2‑1. 日付変換(ja_date

  • 2023-04-012023年04月01日 と表示されます。

4‑2‑2. テキスト省略(truncate_ja

  • 文字列が 50 文字を超える場合は自動で省略記号が付加されます。

5. カスタムフィルターのテスト方法

5‑1. 単体テスト(Pure Python)

SimpleTestCase を使えば Django のテンプレートエンジンに依存しない関数単位のテストが書けます。

5‑2. テンプレート統合テスト

テンプレートを実際にレンダリングして、フィルターが期待通りに動作するか確認します。

5‑3. キャッシュが原因で変更が反映されないときの対処

症状 原因 対策
テンプレートを編集したのに画面が変わらない 開発サーバーがテンプレートキャッシュを保持している python manage.py runserver を再起動、または from django.core.cache import cache; cache.clear() を実行
フィルター追加後に ImportError が出る templatetags ディレクトリが INSTALLED_APPS に含まれていない 該当アプリを settings.INSTALLED_APPS に追記

: Django 標準コマンドに clear_cache は存在しません。キャッシュクリアは上記 Python コードか、使用しているキャッシュバックエンドの管理ツールで行ってください。


6. カスタムフィルターをパッケージ化して他プロジェクトでも再利用

6‑1. プロジェクト構成例

  • src/ 以下に実装を置くことで、ビルド時にパッケージ名とディレクトリ構造が衝突しません。

6‑2. pyproject.toml の基本設定

setup.cfg(または setup.py)でパッケージ探索を有効にします。

6‑3. 開発環境へのインストール

ローカル開発中は editable install が便利です。

6‑4. PyPI 公開手順

  1. python -m build で配布用アーカイブ(wheel と sdist)を作成
  2. twine upload dist/* で公式リポジトリへアップロード

  • バージョンは セマンティックバージョニング に従い、機能追加はマイナーバージョン、破壊的変更はメジャーバージョンを上げます。
  • long_description には README をそのまま流用すると、PyPI のパッケージページが見やすくなります。

7. まとめと次のアクション

  • テンプレートエンジンは表示専用 と認識し、ロジックはビュー/サービス層に置くことで保守性を確保。
  • templatetags ディレクトリ配下にモジュールを作り、@register.filteris_safe / needs_autoescape)で関数を登録すれば、テンプレートからシンプルに呼び出せます。
  • エスケープ制御は必ず意識 し、HTML が安全かどうかに応じて is_safe=Trueneeds_autoescape=True を使い分けましょう。
  • 単体テストとテンプレート統合テストを併用すれば、実装ミスやキャッシュによる不整合を早期に検出できます。
  • 最後に パッケージ化 して pip install できる形にすれば、社内外のプロジェクトで再利用が容易になります。

次のステップ:本記事のコード例をローカルプロジェクトに組み込み、テストを走らせて動作確認してください。その後、必要に応じて自分だけのフィルターを追加し、pyproject.tomlsetup.cfg を整えて社内 PyPI へ公開すれば完了です。

ぜひ実際に手を書きながら学んでみてください!

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Django