题
我正在尝试我的第一个谷歌应用引擎项目–我参与的运动队的简单球员统计数据库。鉴于此模型:
class Player(db.Model):
""" Represents a player in the club. """
first_name = db.StringProperty()
surname = db.StringProperty()
gender = db.StringProperty()
我想创建一个用于创建和修改玩家的基本Web界面。我的代码结构如下所示:
class PlayersPage(webapp.RequestHandler):
def get(self):
# Get all the current players, and store the list.
# We need to store the list so that we can update
# if necessary in post().
self.shown_players = list(Player.all())
# omitted: html-building using django template
此代码生成一个非常基本的HTML页面,其中包含表单和表格。每个玩家的桌子都有一行,看起来像这样:
<tr>
<td><input type=text name="first_name0" value="Test"></td>
<td><input type=text name="surname0" value="Guy"></td>
<td><select name="gender0">
<option value="Male" selected>Male</option>
<option value="Female" >Female</option>
</select></td>
</tr>
<!-- next row: first_name1, etc. -->
我的想法是我会存储我在self.shown_players中使用的Player实例,这样我以后可以在我的 post()
方法(同一类)中通过以下方式更新玩家做:
def post(self):
# some code skipped
for i, player in enumerate(self.shown_players):
fn = self.request.get('first_name'+str(i)).strip()
sn = self.request.get('surname'+str(i)).strip()
gd = self.request.get('gender'+str(i)).strip()
if any([fn != player.first_name,
sn != player.surname,
gd != player.gender]):
player.first_name = fn
player.surname = sn
player.gender = gd
player.put()
但是,这不起作用,因为调用 post()
方法时 self.shown_players
不存在。我想应用程序引擎每次访问页面时都会创建一个新的类实例。
我尝试了同样的想法,但在类或模块级别放置了 shown_players
(并将其称为 global
),但这不能用于我无法理解的原因。
例如:
shown_players = []
class PlayersPage(webapp.RequestHandler):
def get(self):
# Get all the current players, and store the list.
# We need to store the list so that we can update
# if necessary in post().
global shown_players
shown_players[:] = list(Player.all())
shown_players
似乎在 get()
中具有正确的值,因为HTML生成正确,但在 post()
中它是空的。
我该怎么办?
编辑:谢谢,全部。答案(“只是再次检索玩家!”)本来应该是显而易见的:-)也许有一天我会看看memcache,但我不认为玩家名单会在不久的将来超过30。解决方案
在每个请求中,您正在处理同一个类的新实例。这就是为什么你不能在 get()
中创建一个varable并在 post()
中使用它的值。您可以做的是在 post()
-method中再次检索值,或者将数据存储在 memcache
中。
请参阅此处的memcache文档:
其他提示
在你的帖子方法中,就在“for”之前子句,从存储位置检索玩家列表:
def post(self):
# some code skipped
self.shown_players = Player.all().fetch()
for i, player in enumerate(self.shown_players):
...
我从未尝试构建谷歌应用引擎应用,但据我所知,它在处理数据库等方面与Django有些类似。
我认为你不应该将事物存储在全局变量中,而应该单独处理每个事务。 get请求有效,因为您正在做您应该做的事情并从db重新请求信息。
如果您想要更新帖子功能中的播放器,您可能想要传递详细信息, [再次查看具有这些详细信息的播放器] ,并根据需要进行修改。括号中的位是您缺少的步骤。