Django模板如何查找带有variables的字典值

mydict = {"key1":"value1", "key2":"value2"} 

在Django模板中查找字典值的常规方法是{{ mydict.key1 }}{{ mydict.key2 }} 。 如果密钥是一个循环variables呢? 即:

 {% 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失败。 如何解决这个问题?

编写自定义模板filter:

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

(我使用.get这样如果key不存在,它将不返回任何内容。如果你使用dictionary[key]那么将会引发KeyError 。)

用法:

 {{ mydict|get_item:item.NAME }} 

在循环中从字典中获取键和值:

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

我觉得这更容易阅读,避免了特殊编码的需要。 无论如何,我通常需要循环内的键和值。

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

点在模板渲染中有特殊的意义。 variables名称中的点表示查找。 具体而言,当模板系统在variables名称中遇到一个点时,将按以下顺序尝试以下查找:

  • 字典查找。 例如:foo [“bar”]
  • 属性查找。 例如:foo.bar
  • 列表索引查找。 例如:foo [bar]

但你可以做一个filter,让你通过一个参数:

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

 @register.filter(name='lookup') def cut(value, arg): return value[arg] {{ mydict|lookup:item.name }} 

我也有类似的情况。 但是我使用了不同的解决scheme。

在我的模型中,我创build了一个字典查找的属性。 然后在模板中使用属性。

在我的模型中: –

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

在我的模板中: –

 The state is: {{ item.state_ }} 

对于我创build一个名为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 }}