Google App Engine ReferenceProperty关系
问题内容:
我正在尝试使用ReferenceProperty使我的模型相关,但运气不佳。我有3个级别:小组,主题,然后是优点和缺点。因为在一个小组中包含许多主题,并且在每个主题中可能有许多优点和缺点。
我可以很好地存储新的网上论坛,但是我不知道如何在这些网上论坛下存储主题。我想从一个页面链接到每个组下面的“新主题”链接,该链接将它们带到一个简单的表单(目前为1个字段)。显然,URL将需要某种对组ID或其他内容的引用。
这是我的模型:
class Groups(db.Model):
group_user = db.UserProperty()
group_name = db.StringProperty(multiline=True)
group_date = db.DateTimeProperty(auto_now_add=True)
class Topics(db.Model):
topic_user = db.UserProperty()
topic_name = db.StringProperty(multiline=True)
topic_date = db.DateTimeProperty(auto_now_add=True)
topic_group = db.ReferenceProperty(Groups, collection_name='topics')
class Pro(db.Model):
pro_user = db.UserProperty()
pro_content = db.StringProperty(multiline=True)
pro_date = db.IntegerProperty(default=0)
pro_topic = db.ReferenceProperty(Topics, collection_name='pros')
class Con(db.Model):
con_user = db.UserProperty()
con_content = db.StringProperty(multiline=True)
con_date = db.IntegerProperty(default=0)
con_topic = db.ReferenceProperty(Topics, collection_name='cons')
我想在实际页面上显示一个功能,以显示组列表,然后在其主题下:
class Summary(webapp.RequestHandler):
def get(self):
groups_query = Groups.all()
groups = groups_query.fetch(1000)
template_values = {
'groups': groups,
}
path = os.path.join(os.path.dirname(__file__), 'summary.html')
self.response.out.write(template.render(path, template_values))
最后是html:
<html>
<body>
<a href="/newgroup">New Group</a>
<br>
{% for group in groups %}
<font size="24">{{ group.group_name|escape }}</font><br> by <b>{{ group.group_user }}</b> at <b>{{ group.group_date }}</b> {{ group.raw_id }}
<br>
<a href="/newtopic?id={{group.key.id}}" >New topice </a>
<br>
<blockquote>
{{ topics.topics_name }}
</blockquote>
{% endfor %}
</body>
</html>
问题答案:
具有副作用的东西(例如更改存储(例如通过创建新对象)) 不 应该是HTTP GET
-
GET本质上应该只执行“读取”操作。这不是徒有其事,它是HTTP语义的关键部分-
浏览器,缓存,代理等都可以作为只读操作(例如,通过缓存结果并且如果请求不传递请求到服务器,则作为只读操作)可以从缓存中满足)。
要进行修改,请使用HTTP动词,例如POST(之所以流行,主要是因为所有浏览器都正确实现了它),或者用于特殊操作PUT(用于创建新对象)或DELETE(用于删除对象)。我假设您将要使用POST来支持各种浏览器。
要从浏览器获取POST,您需要Javascript向导或带有method = post的普通旧表单-为了简单起见,我将假定后者。
如果您使用的是Django 1.0(应用引擎现在支持),则它具有自己的机制,可以基于模型制作,验证和接受表单。其他框架也有自己类似的高级层。
如果你想避免“富”框架你必须手工模板HTML表单来实现,引导他们(通过某种形式的URL调度,如在app.yaml中的),以与实施你的处理程序def post(self):
,得到来自请求的数据,对其进行验证,形成新对象,将其放入,显示一些确认页面。
您不清楚程序的哪一部分?您问题的标题专门针对参考属性,但我不确定它们特别给您带来什么问题-从问题的文字来看,您似乎对它们有正确的选择。
编辑 :OP现在已在注释中澄清了他的问题是如何制作类似以下内容的内容:
"<a href="/newtopic?id={{group.key.id}}" >New topic </a>"
工作。有多种方法可以做到这一点。如果newtopic
URL由静态表单提供,则该表单的“操作”处理程序可以id=
通过Referer:
标头返回(臭名昭著但无法解决的错误拼写),但这有点笨拙且脆弱。更好的方法是让处理程序提供newtopic
URI,该处理程序从请求中def get
获取id=
并将其插入到生成的表单模板中,例如,在隐藏的输入字段中。使该表单的模板包含(在其他字段中):
<INPUT TYPE=hidden NAME=thegroupid VALUE={{ theid }}> </INPUT>
放置theid
在您用来渲染该模板的上下文中,并且最终将def post
收到表单请求的操作的请求。