在Django模板中通过变量访问dict?

sla*_*acy 26 python django django-templates

我的视图代码基本上看起来像这样:

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']
Run Code Online (Sandbox Code Playgroud)

我想在Django模板中做的是:

<ul>
{% for item in my_list %} 
  <li>{{ item }} : {{ my_dict.item }}</li>
{% endfor %} 
</ul>
Run Code Online (Sandbox Code Playgroud)

我希望这输出:

<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> 
Run Code Online (Sandbox Code Playgroud)

但是通过变量名称via对dict的引用{{ my_dict.item }}实际上并不起作用.我怀疑它是在内部做my_dict['item']而不是my_dict[item].有什么方法可以解决这个问题吗?

Ale*_*nor 15

没有内置的方法,你需要编写一个简单的模板过滤器来执行此操作:http://code.djangoproject.com/ticket/3371

  • 肯定看起来很傻{{my_dict | access:item}} (6认同)
  • @slacy如果你感到不自然和笨拙,你可以考虑看看Jinja.与Django的内置模板系统相比,它更像Pythonic并且不那么自以为是.不是每个人都同意,但我个人更喜欢它. (2认同)

Dav*_*ave 5

这是建议答案的用例.

在这个例子中,我创建了一个通用模板,用于从视图中输出表格数据.有关列的元数据保存在上下文["columnMeta"]中.

由于这是一个字典,我不能依赖键按顺序输出列,所以我将键放在一个单独的列表中.

在我的view.py中:


c["columns"] = ["full_name","age"]
c["columnMeta"] = {"age":{},"full_name":{"label":"name"}}
Run Code Online (Sandbox Code Playgroud)

在我的templatetags文件中:


@register.filter
def getitem ( item, string ):
  return item.get(string,'')
Run Code Online (Sandbox Code Playgroud)

在我的模板中:

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


Ale*_*tic 5

尝试此操作以显示字典的键和值:

{% for key, value in your_dict.items %}
    {{ key }}: {{ value }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for