web-dev-qa-db-ja.com

Django template変数を使用して辞書値を検索する方法

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は失敗します。これを修正する方法は?

191
Stan

カスタムテンプレートフィルターを作成します。

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 }}
303
culebrón

ループ内の辞書からキーと値の両方を取得します。

{% for key, value in mydict.items %}
    {{ value }}
{% endfor %}

これは読みやすく、特別なコーディングの必要がありません。とにかくループ内にキーと値が必要です。

45
Paul Whipp

デフォルトではできません。ドットは、属性検索/キー検索/スライスの区切り文字/トリガーです。

ドットは、テンプレートのレンダリングにおいて特別な意味を持ちます。変数名のドットは、ルックアップを示します。具体的には、テンプレートシステムは変数名にドットを検出すると、次のルックアップをこの順序で試行します。

  • 辞書検索。例: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 }}
27

同様の状況がありました。ただし、別のソリューションを使用しました。

私のモデルでは、辞書検索を行うプロパティを作成します。テンプレートでは、プロパティを使用します。

私のモデルでは:-

@property
def state_(self):
    """ Return the text of the state rather than an integer """
    return self.STATE[self.state]

私のテンプレートでは:-

The state is: {{ item.state_ }}
2
sexybear2

私のアプリでは、以下の内容で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 }}
2
AmiNadimi

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>
0
Yi Yang Apollo