Google App Engine 和 Django 模板:为啥这两种情况不同?

Posted

技术标签:

【中文标题】Google App Engine 和 Django 模板:为啥这两种情况不同?【英文标题】:Google App Engine and Django templates: why do these two cases differ?Google App Engine 和 Django 模板:为什么这两种情况不同? 【发布时间】:2011-01-08 14:00:52 【问题描述】:

我是 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】:

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

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

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

我无法解释为什么第二个版本可以工作。看起来确实不应该。

【讨论】:

你是对的,谢谢 - 第二个有效的原因是因为我复制了错误的代码:存档查询实际上是使用 fetch(limit=100) 正如你所说的。

以上是关于Google App Engine 和 Django 模板:为啥这两种情况不同?的主要内容,如果未能解决你的问题,请参考以下文章

连接 Google App Engine 和 Google Compute Engine

Google App Engine Flexible 和 Google Container Engine 之间的区别?

sql GQL - Alternativa和没有Google App Engine一样

Google App Engine 和 404 错误

如何在 Google Cloud Functions 和 Google App Engine 之间进行选择?

App Engine 和 Google 游戏服务 clientId 冲突