1

嗨,我正在使用 App Engine/Python 做一个简单的网站。我遇到了 Django 模板问题。

简而言之,我想使用“ShortName”来访问“LongName”。

源代码:

LongName={"so":"stackoverflow","su":"superuser"}
ShortName=['so','su']

然后我将这两个参数传递给模板。

在我写的模板中:

{% for aname in ShortName %}
{{ aname }} stands for {{ LongName.aname }},
{% endfor %}

输出是:

so stands for, su stands for

没有给出错误。LongName.aname不会工作。

我不知道出了什么问题。

4

2 回答 2

5

这是试图访问LongName['aname'],不是LongName[aname]

您可能必须编写自定义模板标签/过滤器才能使其正常工作。这个 Django 错误(标记为 WONTFIX)有一个简单的实现:

def get(d, key):
    return d.get(key, '')

register.filter(get)

你会用它

{{ LongName|get:aname }}

将其添加到您的应用程序后(该 SO 答案显示了如何在 GAE 上执行此操作)。


您还可以通过传入预先制作一个变量以在视图中循环

 # in view
 name_abbrevs = [(k, LongName[k]) for k in ShortName]

 # in template
 {% for short_name, long_name in name_abbrevs %}
     {{ short_name }} stands for {{ long_name }}
 {% endif %}

如果您真的不想添加模板标签 - 这还不错!您只需制作一个文件!:) -- 或者传入一个额外的变量,Vic 的方法可以让你在完全不接触 Python 文件的情况下做到这一点。正如他所提到的,它涉及大量无意义的迭代,但它适用于小列表。

于 2012-04-28T18:02:22.250 回答
2

Django 模板在这里有一个缺点。我以前也遇到过同样的情况。您需要做的是遍历 LongName 中的所有键,并检查您要查找的键是否与 ShortName 匹配。干得好:

{% for aname in ShortName %}
  {% for short_version, long_version in LongName %}
    {% if aname == short_version %}
      {{ aname }} stands for {{ long_version }},
    {% endif %}
  {% endfor %}
{% endfor%}

它效率低下,本质上是一种毫无意义的 O(n^2) 机制。然而,在纯 Django 模板中没有更好的方法来通过变量名引用字典的条目。

于 2012-04-28T18:11:41.047 回答