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

1 投票
1 回答
697 浏览
提问于 2025-04-15 18:22

我刚开始学习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 个回答

2

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

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

get() 只会返回第一个符合条件的项目,所以你得到的不是一个可以遍历的集合,而只是一个实例,也就是一个 Entry 对象。

我无法解释为什么第二种写法能工作。看起来它应该是不行的。

撰写回答