首页 文章

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

提问于
浏览
177
mydict = {"key1":"value1", "key2":"value2"}

在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 %}

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

5 回答

  • 35

    编写自定义模板过滤器:

    from django.template.defaulttags import register
    ...
    @register.filter
    def get_item(dictionary, key):
        return dictionary.get(key)
    

    (我使用 .get 以便如果密钥不存在,则返回none . 如果你执行 dictionary[key] 则会引发 KeyError 然后 . )

    用法:

    {{ mydict|get_item:item.NAME }}
    
  • 22

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

    {% for key, value in mydict.items %}
        {{ value }}
    {% endfor %}
    

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

  • 281

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

    点在模板渲染中具有特殊含义 . 变量名中的点表示查找 . 具体来说,当模板系统遇到变量名中的点时,它会按以下顺序尝试以下查找:字典查找 . 示例: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 }}
    
  • 1

    我有类似的情况 . 但是我使用了不同的解决方案 .

    在我的模型中,我创建了一个执行字典查找的属性 . 在模板中,我然后使用该属性 .

    在我的模型中: -

    @property
    def state_(self):
        """ Return the text of the state rather than an integer """
        return self.STATE[self.state]
    

    在我的模板中: -

    The state is: {{ item.state_ }}
    
  • 1

    对于我在我的应用程序中创建一个名为 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)
    

    用法就像culebrón所说:

    {{ mydict|get_item:item.NAME }}
    

相关问题