无法迭代GqlQuery对象

时间:2014-02-06 10:46:17

标签: google-app-engine google-cloud-datastore jinja2 gql

我有一个博客模型,其中包含4个实体,主题,博客,time_created和day_created。我查询所有值并将其分配给传递给jinja2模板的对象。在模板中,我遍历对象并打印每个不同的实体,从而显示每个博客帖子。

数据模型是:

class Blog(db.Model):
    subject = db.StringProperty(required = True, multiline = True)
    blog = db.TextProperty(required = True)
    time_created = db.DateTimeProperty(auto_now_add = True)
    day_created = db.DateProperty(auto_now_add = True)

我查询所有条目以显示为单独的帖子:

posts = db.GqlQuery('SELECT * FROM Blog ORDER BY time_created DESC')

我将这些传递给模板

class Mainpage(BaseHandler):
def get(self):
    posts = Blog_posts()
    logging.info(posts)
    if posts:
        end_time = time.time() - start_time
        logging.info(end_time)
        logging.info(start_time)

    userLogin = self.checkLogin()
    cookieVal = self.read_secure_cookie('user-id')
    if cookieVal:
        u_id = cookieVal.split('|')[0]
        usr_instance = Users.get_by_id(int(u_id))
        if usr_instance:
            name = usr_instance.username
            if userLogin == True and name:
                self.render("blog.html", posts = posts, userLogin = userLogin, user_name = name, end_time = int(end_time))
                logging.info("Logged in = " + str(userLogin))               
        else:
            self.render("blog.html", posts = posts, userLogin = userLogin, user_name = "", end_time = int(end_time))        
    else:
        self.render("blog.html", posts = posts, userLogin = userLogin, user_name = "", end_time = int(end_time)) 

函数render()是:

def render(self, template, **kw):
    self.response.out.write(render_str(template, **kw))

我有一个主模板blogbase.html,我继承到所有其他页面,它包含我用于模板继承的这些行:

<div class="content">
  {% block content %}
  {% endblock %}
</div> 

并在显示主博客页面的html文件中继承:

{% extends "blogbase.html" %}

{% block content %}

    {% for post in posts %}        
      <div class="one_post">          
        <div class="subject_title">
          <div class="day">{{post.day_created.strftime("%d %b %Y")}}</div>
          <a href="/blog/{{post.key().id()}}" target="_blank">   
            {{post.subject}}
          </a>
        </div>
        <div class="post">
            {{post.blog}}
        </div>
      </div>            
    {% endfor %}
    <div class="query">
      Queried {{end_time}} seconds ago
  </div>
{% endblock %}

我添加了一个调试行来查看查询是否有效,并返回true,其中包含以下内容:

<google.appengine.ext.db.GqlQuery object at 0x7f99f03cd050>

但我无法像在模板中那样迭代这个对象,常规的html工作,但for循环之间的部分不会渲染。

我的查询中有什么问题吗?或者我使用模板引擎错了?

1 个答案:

答案 0 :(得分:1)

我注意到的两件事。

您在模板中使用查询来迭代它并执行哪些操作?打印信息?你需要得到实体。在查询或迭代并获取时获取它们。

posts = db.GqlQuery('SELECT * FROM Blog ORDER BY time_created DESC').fetch(1000)

此外,如果您将 dicts 传递给jinja,您可能会想知道您是否正在使用{% for post in posts.iteritems() %},但这不是这种情况。