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

Posted

技术标签:

【中文标题】在 Django 模板中通过变量访问字典?【英文标题】:Accessing a dict by variable in Django templates? 【发布时间】:2011-01-05 05:42:18 【问题描述】:

我的视图代码基本上是这样的:

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 通过变量名引用字典实际上并不起作用。我怀疑它在内部做my_dict['item'] 而不是my_dict[item]。有没有办法解决这个问题?

【问题讨论】:

当然,我总是可以在视图中添加更多代码来表示: context['my_derefernced'] = [ (v, context[my_dict][v]) for v in context['my_list' ] ] 但我宁愿不必这样做。字典可能非常大。 看看这个很棒的解决方案:***.com/questions/35948/… 如果字典很大,为什么不使用生成器?也许是这样的:context['my_dereferenced'] = ( (v, context[my_dict][v]) for v in context['my_list'] ) 【参考方案1】:

没有内置方法可以做到这一点,您需要编写一个简单的模板过滤器来做到这一点:http://code.djangoproject.com/ticket/3371

【讨论】:

谢谢亚历克斯。我知道我可以写一个模板过滤器。为什么不修改模板处理器以包含 foo.bar 尝试 foo.resolve_variable(bar, context) 和 foo[resolve_variable(bar,context)] 的步骤? @slacy 如果你觉得这不自然和笨拙,你可以考虑看看 Jinja。与 Django 的内置模板系统相比,它更具有 Python 风格,而且远没有那么固执己见。不是每个人都同意,但我个人更喜欢它。【参考方案2】:

这是建议答案的一个用例。

在此示例中,我创建了一个通用模板,用于从视图中输出表格数据。有关列的元数据保存在 context["columnMeta"] 中。

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

在我看来.py:


c["columns"] = ["full_name","age"]
c["columnMeta"] = "age":,"full_name":"label":"name"

在我的模板标签文件中:


@register.filter
def getitem ( item, string ):
  return item.get(string,'')

在我的模板中:

% for key in columns % columnMeta|getitem:key|getitem:"label"|default:key % endfor %

【讨论】:

【参考方案3】:

试试这个来显示字典的键和值:

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

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

【讨论】:

【参考方案4】:

根据我的需要,我想要一个适用于字典、列表和元组的模板过滤器。所以,这就是我使用的:

@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

【讨论】:

以上是关于在 Django 模板中通过变量访问字典?的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板无法访问字典查找变量。我在代码中犯了啥错误?

在 Django 模板中通过 Item.objects.all 显示图像

如何在 django 模板中访问字典值

在多处理中通过键访问字典中的值

在 javascript 中通过 django 模板检索 json 数据时出错,在参数列表后给出 Uncaught SyntaxError: missing )

如何在:Django 中通过 URL 传递带空格的变量