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

Python 在Django模板中通过变量访问dict?,python,django,django-templates,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'] 我想在Django模板中做的是: <ul> {% for item in my_list %} <li>{{ item }} : {{ my_

我的视图代码基本上如下所示:

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>
    {my_list%中的项目的%s}
  • {{item}}:{{my_dict.item}
  • {%endfor%}
我希望这个输出:

<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> 
  • d:16
  • f:42
  • e:23
  • b:8
  • c:15
  • a:4

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

没有内置的方法,您需要编写一个简单的模板过滤器来实现这一点:

下面是建议答案的使用案例

在本例中,我创建了一个通用模板,用于从视图输出表格数据。列的元数据保存在上下文[“columnMeta”]中

因为这是一个字典,我不能依靠键来按顺序输出列,所以我将键放在单独的列表中

在my 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> {%列中的键为%} {{columnMeta | getitem:key | getitem:“标签”|默认值:key}} {%endfor%}
尝试此操作以显示字典的键和值:

{% for key, value in your_dict.items %}
    {{ key }}: {{ value }}
{% endfor %}

出于我的需要,我想要一个可以用于dict、list和tuple的单一模板过滤器。所以,我用的是:

@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

当然,我总是可以在视图中添加更多的代码来表示:context['my_deference']=[(v,context[my_dict][v]),用于context['my_list']]中的v,但我不想这样做。dicts可以相当大。看看这个伟大的解决方案:如果dicts很大,为什么不使用生成器呢?可能是这样的:
context['my_dereferenced']=((v,context[my_dict][v])在context['my_list']中表示v)
谢谢Alex。我知道我可以写一个模板过滤器。为什么不修改模板处理器包括{{{英尺}}}的步骤来尝试Fo.ReleVixFixor(bar,上下文)和Fo[RejvEvEngult[Value](bar,上下文)]?@ SLIY,如果感觉不自然和笨拙的话,你可以考虑签出Jinja。与Django的内置模板系统相比,它更具python风格,更不固执己见。不是每个人都同意,但我个人更喜欢它。