Выбор объектов из формы <select>(HTML) - PullRequest
1 голос
/ 23 января 2011

Я учусь использовать Google App Engine / Python.(webapp)

Я пришел из Java (это может быть моей проблемой!), где, если я помещаю объекты в список Swing, это вызовет их метод toString () для целей отображения.Когда я выбрал один из них, он возвращал бы объект, а не только его представление, сгенерированное toString ().

У меня есть модель Person, которая содержит данные о людях:

class Person(db.Model):
  '''represents a single person'''
  first = db.StringProperty()
  last  = db.StringProperty()
  address = db.StringProperty()
  city  = db.StringProperty()
  region = db.StringProperty()
  postal = db.StringProperty()
  country = db.StringProperty()
  phone = db.StringProperty()
  cell = db.StringProperty()
  email = db.StringProperty()
  comment = db.StringProperty(multiline=True)

И модель резервирования, которая хранит информацию о комнате и хранит информацию о том, кому принадлежит человек с резервированием:

class Reservation(db.Model):
    '''represents a single reservation'''
    room = db.StringProperty()
    start_day = db.IntegerProperty()
    start_month = db.IntegerProperty()
    start_year  = db.IntegerProperty()
    end_day = db.IntegerProperty()
    end_month = db.IntegerProperty()
    end_year = db.IntegerProperty()
    percent_discount = db.IntegerProperty()
    comment = db.StringProperty(multiline=True)
    client = #what would go here?

Чтобы получить информацию о резервировании от пользователя и поместить резервирование в базу данных, у меня есть HTMLформа с различными полями, включая номера, дату прибытия, дату отъезда и т. д. Одно из них включает в себя «список клиентов», который получает список лиц, которые уже находятся в базе данных:

    <select size="5" name="client_list"> 
    {% for person in clients %}
        <option>{{ person.first|escape }} {{ person.last|escape }}</option>
    {% endfor %}
</select>

Это работает для отображенияимена, но тогда я не знаю, как сохранить выбранный «Персона» или клиента в резервировании в следующем коде:

class Bookings(webapp.RequestHandler):
    '''Handles all of the bookings'''
    def post(self):
        '''adds a new booking into the db'''
        reservation = models.Reservation()

        reservation.room = self.request.get('room')
        reservation.start_day = int(self.request.get('start_day'))
        reservation.start_month = util.month_to_int(self.request.get('start_month'))
        reservation.start_year = int(self.request.get('start_year'))
        reservation.end_day = int(self.request.get('end_day'))
        reservation.end_month = util.month_to_int(self.request.get('end_month'))
        reservation.end_year = int(self.request.get('end_year'))
        reservation.percent_discount = int(self.request.get('percent_discount'))
        reservation.comment = self.request.get('comment')
        #This would get the clients first + last name, but not the object Person
        #reservation.client = self.request.get('client_list')

        reservation.put()
        self.redirect('/bookings')

Я начал смотреть на ключи (в частности, db.Key.from_path), и как каждый человек, созданный в GAE, генерирует уникальный идентификатор, но тогда я все еще не знаю, как получить этот уникальный идентификатор, назначенный человекуиз списка, отображаемого в HTML, если отображается только имя человека.

Это кажется чем-то возможным и, возможно, простым, но после двух дней поиска я ничего не нашел.Дайте мне знать, если я должен предоставить больше информации, это мой первый пост здесь, в переполнении стека!Спасибо за любой совет.

1 Ответ

5 голосов
/ 23 января 2011

Согласно документации :

Каждый экземпляр модели, который был сохранен в хранилище данных, имеет уникальный ключ, который представляет объект. Метод key() экземпляра модели возвращает объект Key для экземпляра.

Таким образом, вы должны передать клиенту key, , а не полное имя. Исправьте код вашего шаблона:

<select size="5" name="client"> 
  {% for person in clients %}
    <option value="{{ person.key }}">
      {{ person.first|escape }} {{ person.last|escape }}
    </option>
  {% endfor %}
</select>

Укажите, что элемент <option> имеет свой собственный атрибут value. И обратите внимание, почему я изменил имя элемента <select> с cleint_list на client, потому что он не может выбирать несколько элементов, но только один элемент.

Затем получите экземпляр клиента по его ключу. Согласно документации:

Приложение может извлечь экземпляр модели для данного Key, используя функцию get().

Поэтому вставьте следующий код в ваше приложение:

client_key = Key(self.request.get('client'))
client = Person.get(client_key)
if client is None:
    # in case the passed key isn't available
    return
reservation.client = client
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...