Google模板文件中的appengine字符串替换

时间:2009-09-13 05:23:17

标签: python google-app-engine

我正在使用谷歌appengine(python,当然:))我想在模板文件的字符串上做一个string.replace。

{% for item in items %}
  <p>{{ item.code.replace( '_', ' ' ) }}</p>
{% endfor %}

但这不起作用。所以我们不能执行除应用引擎模板中的基本检查之外的任何内容。这是正确的吗?


另一个相关问题是我正在尝试缩短字符串并使其可用于模板。

每个家具对象都有一个名称和一个较长的描述字段。在这个视图我正在渲染,我只想要描述字段的前50个字符。

所以我试过像

这样的东西
items = db.GqlQuery( 'select * from furniture' )

# edit:  if you change the above line to
# items = db.GqlQuery( 'select * from furniture' ).fetch( 1000 )
# the .fetch() command makes the addition of dynamic properties work!

for item in items :
  item.shortdescr = item.description[ 0:50 ]

# pass data off to template for rendering
self.response.out.write(
  template.render( 'furnitureAll.html', { 'items' : items } )
)

模板


{% for item in items %}
  <p>{{ item.name }}</p>
  <p>{{ item.shortdescr }}</p>
  <!-- items.shortdescr does not exist here,
  probably because I did not .put() it previously. -->
{% endfor %}

由于这不起作用,我尝试更改Gql Query来缩短字符串。但我很快意识到Gql不像SQL。我正在尝试编写像

这样的查询
select name,LEFT( description, 50 ) from furniture

收效甚微

2 个答案:

答案 0 :(得分:1)

除了你的代码中没有参数的.fetch()调用,我相信它不可行(你总是必须传递fetch一个参数 - 你实际的最大实体数量愿意获取!),我无法重现你的问题 - 在我的测试中,为每个项目分配一个新属性(包括通过处理现有属性获得的属性)就可以了。

请您尽可能在指南针上重现您观察到的问题并编辑您的问题以包含所有相关文件吗?似乎是我们能够帮助您解决奇怪观察到的错误的唯一方法!

BTW,select name,LEFT( description, 50 )或其他任何课程都不适用于GQL - GQL,非常明确地说,只支持select *来获取整个实体,或select __key__只获得实体的钥匙 - 就是全部;选择中没有列的选择性,更不用说它们的任何操作了! - )

答案 1 :(得分:1)

我对Google AppEngine的经验不多,但我的理解是它与Django密切相关。您的模板实际上并不包含Python代码,即使您在其中使用的某些结构看起来像它。

您的两个问题都应该使用模板过滤器来解决。如果是Django,我会在第二个问题上使用类似的东西:

{{ item.description|truncatewords:10 }}

对于您的第一个问题(字符串替换),可能没有可用于此的内置过滤器。你需要自己编写。像这样的东西;

from google.appengine.ext.webapp.template import create_template_register

register = create_template_register()

@register.filter
def replace_underscores(strng):
    return strng.replace('_', ' ')

然后,在您的模板中,您可以执行此操作:

{{ item.code|replace_underscores }}