mydict = {"key1":"value1", "key2":"value2"}
Djangoテンプレートで辞書の値を検索する通常の方法は、{{ mydict.key1 }}
、{{ mydict.key2 }}
です。キーがループ変数の場合はどうなりますか?すなわち:
{% for item in list %} # where item has an attribute NAME
{{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}
mydict.item.NAME
は失敗します。これを修正する方法は?
カスタムテンプレートフィルターを作成します。
from Django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
(私は.get
を使用しているため、キーがない場合は何も返しません。dictionary[key]
を実行すると、KeyError
が発生します。)
使用法:
{{ mydict|get_item:item.NAME }}
ループ内の辞書からキーと値の両方を取得します。
{% for key, value in mydict.items %}
{{ value }}
{% endfor %}
これは読みやすく、特別なコーディングの必要がありません。とにかくループ内にキーと値が必要です。
デフォルトではできません。ドットは、属性検索/キー検索/スライスの区切り文字/トリガーです。
ドットは、テンプレートのレンダリングにおいて特別な意味を持ちます。変数名のドットは、ルックアップを示します。具体的には、テンプレートシステムは変数名にドットを検出すると、次のルックアップをこの順序で試行します。
- 辞書検索。例:foo ["bar"]
- 属性ルックアップ。例:foo.bar
- リストインデックスルックアップ。例:foo [bar]
ただし、引数を渡すことができるフィルターを作成できます。
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
@register.filter(name='lookup')
def lookup(value, arg):
return value[arg]
{{ mydict|lookup:item.name }}
同様の状況がありました。ただし、別のソリューションを使用しました。
私のモデルでは、辞書検索を行うプロパティを作成します。テンプレートでは、プロパティを使用します。
私のモデルでは:-
@property
def state_(self):
""" Return the text of the state rather than an integer """
return self.STATE[self.state]
私のテンプレートでは:-
The state is: {{ item.state_ }}
私のアプリでは、以下の内容でtemplate_filters.py
という名前のpythonファイルを作成しました。
# coding=utf-8
from Django.template.base import Library
register = Library()
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
使用法は、クレブロンが言ったことに似ています:
{{ mydict|get_item:item.NAME }}
env:Django 2.1.7
表示:
dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag}
return render(request, 'obj.html', {'dict_objs': dict_objs})
テンプレート:
{% for obj_id,dict_obj in dict_objs.items %}
<td>{{ dict_obj.obj.obj_name }}</td>
<td style="display:none">{{ obj_id }}</td>
<td>{{ forloop.counter }}</td>
<td>{{ dict_obj.obj.update_timestamp|date:"Y-m-d H:i:s"}}</td>