Python / Django:简单的Django模板

时间:2012-04-28 17:59:36

标签: python django google-app-engine

您好我正在使用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无效。

我不知道什么是错的。

2 个答案:

答案 0 :(得分:5)

这是为了访问LongName['aname'],而不是LongName[aname]

您可能必须编写自定义模板标记/过滤器才能使其生效。 This Django bug(标记为WONTFIX)有一个简单的实现:

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

register.filter(get)

你将使用

{{ LongName|get:aname }}

adding it to your app之后(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's approach将允许你这样做而不需要触及Python文件。正如他所提到的那样,它涉及很多无意义的迭代,但它对于小型列表都可以正常工作。

答案 1 :(得分: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模板中没有更好的方法来通过变量名引用dict的条目。