Python/Django:简单的Django模板

Sus*_*yer 1 python django google-app-engine

嗨,我正在使用App Engine/Python来做一个简单的网站.我有一个Django模板问题的麻烦.

简而言之,我想使用"ShortName"来访问"LongName".

源代码:

LongName={"so":"stackoverflow","su":"superuser"}
ShortName=['so','su']
Run Code Online (Sandbox Code Playgroud)

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

在我写的模板中:

{% for aname in ShortName %}
{{ aname }} stands for {{ LongName.aname }},
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

输出是:

so stands for, su stands for
Run Code Online (Sandbox Code Playgroud)

没有错误.该LongName.aname不会工作.

我不知道什么是错的.

Dou*_*gal 5

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

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

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

register.filter(get)
Run Code Online (Sandbox Code Playgroud)

你会用到哪个

{{ LongName|get:aname }}
Run Code Online (Sandbox Code Playgroud)

之后将其添加到您的应用程序(即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 %}
Run Code Online (Sandbox Code Playgroud)

如果你真的不想添加模板标签 - 这不是那么糟糕!你只需要制作一个文件!:) - 或传入一个额外的变量,Vic的方法将让你这样做而不用触及Python文件.正如他所提到的,它涉及很多无意义的迭代,但它对小型列表也适用.