我正在嘗試我的第一個谷歌應用引擎項目 - 一個簡單的球員統計數據庫,我參與了一個運動隊。鑑於此型號:更新谷歌應用引擎中的數據
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使用的播放器實例,因此,如果必要,我可以在以後更新的玩家我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()
然而,這不起作用,因爲self.shown_players
當post()
方法被調用不存在。我想應用程序引擎每次訪問頁面時都會創建一個新的類實例。
我嘗試了相同的想法,但將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人..
+1 memcached的建議,以減少對數據庫的命中 – 2009-04-29 09:06:08