気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【Django】テンプレートフィルタを自分で作る

templatetagsディレクトリを作成する

・アプリケーションディレクトリと同じ階層に作成する
・__init__.pyを作成し、パッケージ化する

ROOT
`-- project_dir
   |
   |--project_name_dir
   |
   |--app_dir
   |
   |--templatetags
   |  | 
   |  |--__init__.py
   |  
   `

templatetagsディレクトリの中に任意の名前で、pythonソースを作成する

・my_filter.pyとした

ROOT
`-- project_dir
   |
   |--project_name_dir
   |
   |--app_dir
   |
   |--templatetags
   |  | 
   |  |--__init__.py
   |  |-- my_filter.py
   `

フィルタの処理を書き、Djangoテンプレートから使えるようにする

# coding: utf-8
from django.template.defaultfilters import register

"""
 カスタムテンプレートフィルター
"""

# register.filterデコレータ
# register.filter('is_any_data_exists', is_any_data_exists')でも可
@register.filter
def is_any_data_exists(obj, pk):
    obj_list = obj.any_manytomany_field.filter(id=pk)
    if obj_list:
        return True
    else:
        return False

テンプレートから利用する

targetのmany_to_many_fieldに、
any_obj_pkのデータがあればTrue、なければFalseを返す

【具体例】
--------------------------------
ユーザ <- 既読一覧 -> 文書
--------------------------------
・文書(target)に対して、該当ユーザー(any_obj_pk)の既読データがあるかないかを確認する
 ⇒データがあれば、既読
 ⇒なければ未読
{% comment %}自作したフィルタを含むパッケージ名を指定{% endcomment %}
{% load my_filter %}

{% for target in target_list %}
<tr>
    <td>
        {% if not target|is_any_data_exists:any_obj_pk %}
            <small>未読</small>
        {% endif %}
        <a target="_blank" href="{% url 'project:any_view_name' obj_id=obj.id %}">{{ target.title }}</a>
    </td>
</tr>
{% endfor %}