我的观看代码看起来基本上是这样的:
context = Context()
context['my_dict'] = {'a': 4, 'b': 8, 'c': 15, 'd': 16, 'e': 23, 'f': 42 }
context['my_list'] = ['d', 'f', 'e', 'b', 'c', 'a']
我想在Django模板中做的是:
<ul>
{% for item in my_list %}
<li>{{ item }} : {{ my_dict.item }}</li>
{% endfor %}
</ul>
我希望输出:
<ul>
<li> d : 16 </li>
<li> f : 42 </li>
<li> e : 23 </li>
<li> b : 8 </li>
<li> c : 15 </li>
<li> a : 4 </li>
</ul>
但是通过{{ my_dict.item }}
通过变量名对dict的引用实际上并不起作用。我怀疑它在内部正在my_dict['item']
而不是my_dict[item]
。有什么方法可以解决这个问题吗?
答案 0 :(得分:15)
没有内置方法可以做到这一点,您需要编写一个简单的模板过滤器来执行此操作:http://code.djangoproject.com/ticket/3371
答案 1 :(得分:5)
以下是建议答案的使用案例。
在这个例子中,我创建了一个通用模板,用于从视图中输出表格数据。有关列的元数据保存在上下文[“columnMeta”]中。
由于这是一本字典,我不能依赖按键按顺序输出列,所以我把密钥放在一个单独的列表中。
在我的view.py中:
c["columns"] = ["full_name","age"]
c["columnMeta"] = {"age":{},"full_name":{"label":"name"}}
在我的templatetags文件中:
@register.filter
def getitem ( item, string ):
return item.get(string,'')
在我的模板中:
<tr> <!-- iterate columns in order specified --> {% for key in columns %} <th> <span class="column-title"> <!-- look label in meta dict. If not found, use the column key --> {{columnMeta|getitem:key|getitem:"label"|default:key}} </span> </th> {% endfor %}</tr>
答案 2 :(得分:5)
尝试此操作以显示字典的键和值:
{% for key, value in your_dict.items %}
{{ key }}: {{ value }}
{% endfor %}
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for
答案 3 :(得分:2)
根据我的需要,我想要一个适用于dicts,list和tuples的模板过滤器。所以,这就是我使用的:
@register.filter
def get_item(container, key):
if type(container) is dict:
return container.get(key)
elif type(container) in (list, tuple):
return container[key] if len(container) > key else None
return None