首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python/ Django :简单的Django模板

Python/ Django :简单的Django模板
EN

Stack Overflow用户
提问于 2012-04-29 01:59:36
回答 2查看 392关注 0票数 1

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

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

源码:

代码语言:javascript
复制
LongName={"so":"stackoverflow","su":"superuser"}
ShortName=['so','su']

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

在模板中,我写道:

代码语言:javascript
复制
{% for aname in ShortName %}
{{ aname }} stands for {{ LongName.aname }},
{% endfor %}

输出为:

代码语言:javascript
复制
so stands for, su stands for

未给出任何错误。LongName.aname无法工作。

我不知道出了什么问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-29 02:02:22

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

您可能需要编写一个自定义模板标记/过滤器才能使其正常工作。This Django bug (标记为WONTFIX)有一个简单的实现:

代码语言:javascript
复制
def get(d, key):
    return d.get(key, '')

register.filter(get)

您将通过以下方式使用

代码语言:javascript
复制
{{ LongName|get:aname }}

adding it to your app之后(所以答案显示了如何在GAE上这样做)。

您还可以预先创建一个在视图中循环的变量,方法是传入

代码语言:javascript
复制
 # 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文件的情况下完成此操作。正如他提到的,它涉及到许多无意义的迭代,但它在小列表中工作得很好。

票数 5
EN

Stack Overflow用户

发布于 2012-04-29 02:11:41

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

代码语言:javascript
复制
{% 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的条目。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10366111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档