Django模板如何使用变量查找字典值

Sta*_*tan 207 python django templates dictionary

mydict = {"key1":"value1", "key2":"value2"}
Run Code Online (Sandbox Code Playgroud)

在Django模板中查找字典值的常规方法是{{ mydict.key1 }}, {{ mydict.key2 }}.如果键是循环变量怎么办?即:

{% for item in list %} # where item has an attribute NAME
  {{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

mydict.item.NAME失败.如何解决这个问题?

cul*_*rón 326

编写自定义模板过滤器:

from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)
Run Code Online (Sandbox Code Playgroud)

(我.get这样使用,如果没有密钥,它就不会返回.如果你这样做,dictionary[key]它会提高一个KeyError.)

用法:

{{ mydict|get_item:item.NAME }}
Run Code Online (Sandbox Code Playgroud)

  • 为什么这不是默认内置的?:-( (262认同)
  • [Django自定义模板标签文档](https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-tags),适用于将来发现这一点的人. (16认同)
  • 我认为@Jeff意味着[Django自定义模板过滤器文档](https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters) (11认同)
  • @buffer看了票,我可以说这太荒谬了. (10认同)
  • 过滤器是否包含views.py,一些额外的filters.py或什么文件? (9认同)
  • 在Jinja2 {{mydict [key]}} (5认同)
  • 好的解决方案 @BerislavLopac可悲的是,它是与Django核心开发人员的wontfix:https://code.djangoproject.com/ticket/3371 (4认同)
  • +alanse 我将它添加为有问题的 views.py 函数内的子函数......但请参阅 https://docs.djangoproject.com/en/1.10/howto/custom-template-tags/#code-layout (3认同)
  • @BerislavLopac因为Django模板语言在创建时很糟糕,今天仍然很糟糕.朋友不要让朋友使用Django模板. (3认同)
  • @floatingpurr我仍然从中得到红利:) (2认同)

Pau*_*ipp 46

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

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

我发现这更容易阅读,它避免了特殊编码的需要.无论如何,我通常需要键中的键和值.

  • 他没有要求列举一个字典(如你所示) - 他要求给出一个变量键给dict的值.您的提案未提供解决方案. (24认同)
  • 请注意,如果您尝试访问的字典中包含另一个字典,则这不起作用。 (2认同)

Yuj*_*ita 33

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

点在模板渲染中具有特殊含义.变量名中的点表示查找.具体来说,当模板系统遇到变量名中的点时,它会按以下顺序尝试以下查找:

  • 字典查找.示例:foo ["bar"]
  • 属性查找.示例:foo.bar
  • 列表索引查找.示例:foo [bar]

但是你可以制作一个允许你传入参数的过滤器:

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

@register.filter(name='lookup')
def lookup(value, arg):
    return value[arg]

{{ mydict|lookup:item.name }}
Run Code Online (Sandbox Code Playgroud)

  • 我仍然会使用“return value.get(arg)”,因为如果密钥不存在,则不会引发 KeyError 异常。 (3认同)

Ami*_*imi 6

对我来说,创建一个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)
Run Code Online (Sandbox Code Playgroud)

用法就像 culebrón 所说的:

{{ mydict|get_item:item.NAME }}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想让你的所有模板都知道你的新过滤器,那么你必须在 `django.template.base.Library` 类下注册它。通过 `register = Library()` 我们实例化该类并在其中使用 `filter` 函数注释器来满足我们的需要。 (2认同)