2010-01-23 41 views
1

我是新来的Python,和我使用谷歌应用程序引擎构建一个简单的博客,以帮助我学习它。我有以下的测试代码:Google App Engine和Django模板:为什么这两种情况有所不同?

entries = db.Query(Entry).order("-published").get() 
     comments = db.Query(Comment).order("published").get() 
     self.response.out.write(template.render(templatePath + 'test.django.html', { 'entries': entries, 'comments': comments, })) 

而且看起来像这样的Django模板:

{% extends "master.django.html" %} 

{% block pagetitle %}Test Page{% endblock pagetitle %} 

{% block content %} 

{% for e in entries %} 

<p><a href="/post/{{ e.slug }}/">{{ e.title|escape }} - {{ e.published|date:"jS o\f F Y" }}</p> 

{% endfor %} 

{% for c in comments.all %} 

<p>{{ c.authorname }} {{ c.published|date:"d/m/Y h:i" }}</p> 

{% endfor %} 

{% endblock content %} 

当我在浏览器中查看该模板页,我得到:

TypeError: 'Entry' object is not iterable 

将行{% for e in entries %}更改为{% for e in entries.all %}解决了这个问题,这很好。

但是,这是我不明白的一点;在另一个模板(存档网页),我通过在同样的事情,入学对象的列表:

entries = db.Query(Entry).order("-published").fetch(limit=100) 
     self.response.out.write(template.render(templatePath + 'archive.django.html', { 'entries': entries, })) 

随着模板如下:

{% extends "master.django.html" %} 

{% block pagetitle %}Home Page{% endblock pagetitle %} 

{% block content %} 

<ul> 

{% for entry in entries %} 

<li><a href="/post/{{ entry.slug }}/">{{ entry.title|escape }} <span>{{ entry.published|date:"jS o\f F Y" }}</a>{% if admin %} - <a href="/compose/?key={{ entry.key }}">Edit Post</a>{% endif %}</span></li> 

{% endfor %} 

{% endblock content %} 

此代码工作正常,entries更改为entries.all;确实如果我改变它,我得不到输出(没有错误,只是没有)。

有人能解释这是为什么吗?

编辑:我本来粘贴在第二个例子中的错件的查询代码,这将有可能使事情更容易为人们给我一个答案......现在改变了它。

回答

2

你想用.fetch(),不能获得():

entries = db.Query(Entry).order("-published").fetch() 
comments = db.Query(Comment).order("published").fetch() 

get()返回只有符合查询条件的第一个项目,所以不是一个可迭代的收集,你会得到一个实例和Entry对象。

我无法解释为什么第二个版本不工作。它看起来应该不是。

+0

你说得对,谢谢 - ,第二个作品的原因是因为我抄错的代码:档案查询被实际使用取(上限为100)如你所说。 – 2010-01-23 17:04:35

相关问题