Google App Engine和Django模板:为什么这两种情况有所不同?

时间:2010-01-23 15:50:32

标签: python google-app-engine django-templates

我是Python新手,我正在使用Google App Engine构建一个简单的博客来帮助我学习它。我有以下测试代码:

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 %}可解决此问题,这很棒。

然而,这是我不明白的一点;在另一个模板(对于存档页面)中,我传入相同的东西,一个Entry对象列表:

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;事实上,如果我将其更改为我没有输出(没有错误,根本没有任何错误)。

有人可以解释为什么会这样吗?

编辑:我最初为第二个例子粘贴了错误的查询代码,这可能会让人们更容易给我一个答案......现在改了。

1 个答案:

答案 0 :(得分:2)

你想使用.fetch(),而不是get():

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

get()仅返回与查询条件匹配的第一个项,因此,您将获得一个实例和Entry对象,而不是可迭代的集合。

我无法解释为什么第二个版本确实有效。它看起来真的不应该。