如何将GAE NDB的后代打印到Jinja2上?

时间:2016-12-19 04:47:41

标签: python python-2.7 google-app-engine jinja2

所以我一直在修补jinja2和谷歌应用引擎。我只是在业余时间写一个小玩具应用程序;该应用程序有一个网页,显示最近的十个帖子及其评论。

在创建Post对象并将其存储在数据库中之后,在Google数据存储中使用以下内容,所有博客帖子都可以正常打印到页面上。我使用以下查询来显示十个帖子。

recent_blog_posts = ndb.gql("SELECT * FROM Posts ORDER BY created_at
DESC LIMIT 10;")

以下blogpage.html代码:

{% block content %}
{% for post in recent_blog_posts %}
    <div>
        <h3>{{post.title}}</h3>
        <pre>
            <p style="max-width: 100%;">{{post.post}}</p>
        </pre>
        <p>By: {{post.by_user}}</p>
        <!-- this is where I want the comments to go (explained below)-->
        <h4>Leave A Comment:</h4>
        <form method="post">
            <textarea name="comment" value="{{comment}}" style="height: 50px; width: 200px;"></textarea>
            <input type="hidden" name="post_key" value="{{post.key}}">
            <br>
            <button>Comment</button>
        </form>
    </div>
    <hr>
{% endfor %}
{% endblock %}

我只是迭代上面查询中的十个对象来打印所有博客帖子。但是,这对我来说很棘手。

我使用以下内容创建一个新的Comment实例:

new_comment = Comments(comment = comment,
user = user.name, parent = ndb.Key(Posts, int(post_key)))
new_comment_key = new_comment.put()

当我将新的Comment实例打印到屏幕上时,只需要查看,它们都会使用正确的父项和它们自己的ID正确打印出来。

现在,我不知道如何获取每个Comment实例并使用相应的帖子打印它。我怎么能做到这一点?

我到处搜索,甚至将其添加到上面的html模板中。 (代替上面html模板中的评论)

{% for comment in comment_query %}
    {{comment.comment}}
{% endfor %}

使用以下查询:

recent_comments = Comments.query(ancestor=ndb.Key(Posts, int(new_string))).order(-Comments.created_at).fetch(limit=3)

这显然只是打印出页面上所有Posts实例的所有Comments实例。

提前致谢

1 个答案:

答案 0 :(得分:1)

只需在后端本身形成输出列表。

recent_blog_posts = ndb.gql("SELECT * FROM Posts ORDER BY created_at
DESC LIMIT 10;")
posts_with_comments = []
for post in recent_blog_posts:
    recent_comments = Comments.query(ancestor=post.key).order(-Comments.created_at).fetch(limit=3)
    posts_with_comments.append([post, recent_commmnets])

然后在模板中迭代posts_with_comments,如

{% for post,comments in posts_with_comments %}
    <div>
        <h3>{{post.title}}</h3>
        <pre>
            <p style="max-width: 100%;">{{post.post}}</p>
        </pre>
        <p>By: {{post.by_user}}</p>
        <p> Comments: </p>
        {% for commnet in comments %}
           {{ comment }}
        {% endfor %}
{% endfor %}