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