代码之家  ›  专栏  ›  技术社区  ›  Mark Bell

谷歌应用引擎和django模板:为什么这两种情况不同?

  •  1
  • Mark Bell  · 技术社区  · 15 年前

    我对python不熟悉,我正在使用谷歌应用引擎构建一个简单的博客来帮助我学习它。我有以下测试代码:

    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 如果我 把它改为我没有输出(没有错误,什么都没有)。

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

    编辑:我最初为第二个示例粘贴了错误的查询代码,这可能使人们更容易回答我的问题…现在换了。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Adam Crossland    15 年前

    您要使用.fetch(),而不是get():

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

    get()只返回与查询条件匹配的第一个项,因此您将得到一个实例和entry对象,而不是一个iterable集合。

    我不能解释为什么第二个版本有效。看起来真的不应该。