Я пытаюсь создать свой первый проект движка приложения для Google - простую базу данных об игроке для спортивной команды, с которой я работаю. Учитывая эту модель:
class Player(db.Model):
""" Represents a player in the club. """
first_name = db.StringProperty()
surname = db.StringProperty()
gender = db.StringProperty()
Я хочу сделать базовый веб-интерфейс для создания и модификации плееров. Моя структура кода выглядит примерно так:
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. -->
Моя идея заключается в том, что я буду хранить экземпляры Player, которые я использовал, в 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 в ближайшем будущем ..