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,这样如果键不存在,它就返回none。如果你使用dictionary[key],它将引发一个KeyError。)

用法:

{{ mydict|get_item:item.NAME }}

其他回答

默认情况下你不能。点是属性查找/键查找/切片的分隔符/触发器。

点在模板渲染中有特殊的含义。变量中的点 名称表示查找。具体来说,当模板系统 在变量名中遇到一个点,它会尝试以下查找, 依次为: 字典查找。例如:foo(“酒吧”) 属性查询。例如:foo.bar List-index查找。例如:foo(酒吧)

但是你可以创建一个过滤器,让你传入一个参数:

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 }}

对我来说,在我的应用程序中创建一个名为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)

用法就像culebrón说的那样:

{{ mydict|get_item: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_ }}

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>

编写一个自定义模板过滤器:

from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

(我使用.get,这样如果键不存在,它就返回none。如果你使用dictionary[key],它将引发一个KeyError。)

用法:

{{ mydict|get_item:item.NAME }}