2012-04-28 72 views
1

嗨我正在使用App Engine/Python来做一个简单的网站。我在Django模板问题上遇到了一些麻烦。Python/Django:简单的Django模板

总之,我想用一个“ShortName”来访问“LongName”。

的soource代码:

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不会工作。

我不知道什么是错的。

+1

它在我看来像你的LongName声明有一个不需要的和无与伦比的单引号。这实际上是在你的代码中,还是只是你的问题中的一个错字? – 2012-04-28 18:06:44

+0

@亚当它是一个错字。编辑。 – 2012-04-28 18:12:50

回答

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

非常感谢!给源代码添加东西的想法让我感到害怕。我没有搞乱源代码的经验。 – 2012-04-28 18:27:37

+0

你真的编辑你的答案来使用我的答案吗?你需要找到一个更好的方式来度过你的周末。 – 2012-04-28 18:53:00

+0

@VicFryzel咦?我编辑的添加不使用你的方法(没有嵌套循环)。我最终确实与你的答案联系在一起,并谈论它与我建议的其他方法的关系。 – Dougal 2012-04-28 18:56:19

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模板中没有更好的方式通过变量名来引用字典的条目。