Google App Engine 和 Django 模板:这两种情况为何不同?
我刚开始学习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 对象。
我无法解释为什么第二种写法能工作。看起来它应该是不行的。