【Django】辞書型のキーを変数で指定して値をテンプレートに出力する

Djangoテンプレート辞書型の値を出力するには以下のようにキーを.で繋げます。

views.py
from django.shortcuts import render


def index(request):

    dict_data = {
        'key1': 'spam',
        'key2': 'ham',
    }

    context = {
        'dict_data': dict_data,
    }

    return render(request, 'index.html', context)
Template
{{dict_data.key1}}

このように出力するキーが決まっているのならこれで良いのですが、キーが変数になっている場合には単純に変数を.で繋ぐことはできません。

以下ではテンプレートに辞書型の値は表示されません。

views.py
from django.shortcuts import render


def index(request):

    dict_data = {
        'key1': 'spam',
        'key2': 'ham',
    }

    target_key = 'key1'

    context = {
        'dict_data': dict_data,
        'target_key': target_key,
    }

    return render(request, 'index.html', context)
Template
{{dict_data.target_key}}

Djangoの仕様ではテンプレート上で辞書型のキーを変数では指定できません。
その場合、カスタムフィルターを自作する必要があります!

この記事は、辞書型のキーを変数で指定して値をテンプレートに出力するカスタムフィルターのサンプルプログラムになります。参考になりましたら幸いです。

Djangoのテンプレートにキーが変数の辞書型の値を出力する

こちらがサンプルプログラムになります。

views.py
from django.shortcuts import render


def index(request):

    dict_data = {
        'key1': 'spam',
        'key2': 'ham',
    }

    target_key = 'key1'

    context = {
        'dict_data': dict_data,
        'target_key': target_key,
    }

    return render(request, 'index.html', context)
Template
{%load custom_filter%}

{{dict_data|get_value:target_key}}
Filter
from django import template

register = template.Library()


@register.filter
def get_value(d, k):
    if (k in d.keys()):
        return d[k]
    else:
        return None

カスタムフィルターの作成方法
https://docs.djangoproject.com/ja/3.2/howto/custom-template-tags/

まとめ

以上が辞書型のキーを変数で指定して値をテンプレートに出力するカスタムフィルターのサンプルプログラムでした。

サンプルプログラム
https://github.com/attack-on-fukukai/sample_django_template_dict

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