最近我阅读了关于App Engine的“核心Python”一书,并通过解释实现了博客示例。 我正在尝试扩展此示例以允许在博客帖子中发表评论,但我遇到了一些困难。
我有两个型号:
BlogPost(标签,文本,时间戳) - 它是存储标签,文本和帖子创建时间的表
评论(blog_post,text) - blog_post是一个BlogProost模型的ReferenceProperty,用于分配评论及其相关的博客文章。
我的难点在于检索BlogPost密钥以使用用户输入的注释正确分配它。我认为我应该对帖子执行查询,获取其密钥并将其放在用户创建的新评论(当然,如果它是创建的)上。但是在这一刻我不明白(以明确的方式)我应该如何编写这些步骤。
换句话说,我需要做一些与此处提供的“一对多”解释相关的事情 - https://developers.google.com/appengine/articles/modeling。但是我需要根据我的实现来做,用我的html表单中的用户输入生成实例模型。
下面,我让我现在正在使用的代码,感谢您的帮助。
//app.yaml
application: src
version: 1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /favicon\.ico
static_files: favicon.ico
upload: favicon\.ico
- url: .*
script: main.app
和
// main.py
import webapp2
from google.appengine.ext import db
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.out.write('''
<h1>The Blog Posts</h1>
<form action="/post" method=post>
Title:
<br><input type=text name=title>
<br>Body:
<br><textarea name=body rows=3 cols=60></textarea>
<br><input type=submit value="Post">
</form>
<hr>
''')
#posts = db.GqlQuery("SELECT * FROM BlogEntry")
posts = BlogPost.all().order('-timestamp').fetch(10)
for post in posts:
self.response.out.write('''<hr>
<strong>%s</strong><br>%s
<blockquote>%s</blockquote>''' % (
post.title, post.timestamp, post.body)
)
class BlogEntry(webapp2.RequestHandler):
def post(self):
post = BlogPost()
post.title = self.request.get('title')
post.body = self.request.get('body')
post.put()
self.redirect('/')
#model
class BlogPost(db.Model):
title = db.StringProperty()
body = db.TextProperty()
timestamp = db.DateTimeProperty(auto_now_add=True)
app = webapp2.WSGIApplication([
('/', MainHandler),
('/post', BlogEntry)
], debug=True)
答案 0 :(得分:1)
一种设计是为每篇博文发布评论表。然后,您可以将BlogPost
的键作为表单中的隐藏字段包含在内。为了减少目标网页上的混乱,您可能希望为每个BlogPost
设置一个单独的页面,您可以在其中提交用户的评论。
此处有一个设计示例:https://bitbucket.org/abernier/yab/src相关的代码片段为PostHandler
in /views.py
,随附的标记位于/templates/view.html
。
答案 1 :(得分:0)
在NDB中,如果评论中有其他字段,则可以使用重复属性或重复的结构化属性。重复属性的行为类似于Python列表,您可以在其中放置博客文章的所有注释。而且你只需要一次阅读。