【问题标题】:How to use django template dot notation inside a for loop如何在 for 循环中使用 django 模板点表示法
【发布时间】:2011-05-20 18:24:31
【问题描述】:

我正在尝试检索字典键的值并将其显示在 Django 模板中的页面上:

{% for dictkey in keys %}
    <p> {{ mydict.dictkey }} </p>
{% endfor %}

(假设 'keys' 和 'mydict' 已被传递到 Context 中的模板中)

Django 呈现页面但没有字典内容(“无效的模板变量”)

我认为问题是它试图做 mydict['dictkey'] 而不是 mydict[actual key IN the variable dictkey]?一个人如何“逃避”这种行为?

谢谢!

更新: 根据收到的答案,我需要补充一点,我实际上正在专门寻找如何在 for 循环中实现键查找。这更能代表我的实际代码:

{% for key, value in mydict1.items %}
    <p> {{ mydict2.key }} </p>
{% endfor %}

基本上,我有两个共享相同键的字典,所以我不能为第二个字典使用 items() 技巧。

【问题讨论】:

  • 模板中的逻辑越少越好。在传递数据以进行渲染之前,尝试以易于模板化的方式准备数据。

标签: python django django-templates


【解决方案1】:

请参阅this answer 到一个(可能重复的)相关问题。

它创建了一个自定义过滤器,当将其应用于以键为参数的字典时,会使用该键对字典进行查找并返回结果。

代码:

@register.filter
def lookup(d, key):
    if key not in d:
        return None
    return d[key]

用法:

{% for dictkey in dict1.keys %}
    <p> {{ dict2|lookup:dictkey }} </p>
{% endfor %}

documentation 中介绍了注册过滤器。

我很遗憾没有内置这种东西。

【讨论】:

  • @Cameron:很好,看起来它会做我想做的事!谢谢!但是,是的,不应该为如此简单的事情使用这样的自定义过滤器。至少我现在知道自定义过滤器了 :)
  • @mindthief:很高兴能帮上忙。如果故意在 Django 模板中施加的限制开始让您感到太多,您可能需要考虑切换到另一种模板语言——Jinja2 非常好,并且具有相似的语法但更多的功能(包括字典查找!)
  • 感谢您的提示!所以我在让自定义过滤器在 atm 工作时遇到了一些麻烦——我把它放在一个文件 myextras.py 中,该文件与 django 项目位于同一文件夹中。在 template.html 文件的顶部添加了 {% load myextras %},该文件包含您提供的代码(@register filter def lookup...)。我还在这个文件中添加了“from django import template”和“register = template.Library()”,看看是否可行,但我仍然收到错误消息“myextras 不是有效的标签库:找不到模板库 myextras ,试过 django.templatetags.myextras”。有什么想法吗?
  • @mindthief:听起来 Django 找不到 myextras(您的代码似乎正确)。 myextras.py 是否在 templatetags 目录中?目录中是否有一个空的__init__.py 文件?确保您的目录完全按照instructions
  • @Cameron:是的,就是这样!呃,我犹豫是否要添加一个新应用程序只是为了让过滤器工作,所以我试图将 templatetags/ 文件夹放在主 django 项目文件夹中(这个项目中没有任何应用程序)。我认为它应该能够在该文件夹中找到它,就像它在“已安装的应用程序”中一样,但显然不是。我现在试过了,它奏效了——也就是说,我做了'python manage.py startapp extras'。然后将 templatetags/ 复制到该文件夹​​中,将“myproj.extras”添加到 settings.py 中的 INSTALLED_APPS,然后就完成了。非常感谢您的帮助! :)
【解决方案2】:

来自http://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

如果您需要访问字典中的项目,这也很有用。例如,如果您的上下文包含字典数据,则以下内容将显示字典的键和值:

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

诀窍是您需要调用dict.items() 来获取(key, value) 对。

【讨论】:

  • 我确实这样做了,但是为了另一个字典。我猜的问题是我实际上有两个共享相同键的字典。其中之一在 for 循环中为: for key, value in myDict1.items:

    {{ myDict2.key }}

【解决方案3】:

查看文档:http://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 2013-10-26
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2012-07-25
    相关资源
    最近更新 更多