从<select>表单中选择对象(HTML)

Jay*_*com 1 html python google-app-engine select object

我正在学习如何使用Google App Engine/Python.(web应用)

我来自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)
Run Code Online (Sandbox Code Playgroud)

以及预订模型,用于存储有关房间的信息,并存储人员所属的预订:

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?
Run Code Online (Sandbox Code Playgroud)

为了从用户获取预订信息,并将预订放入数据库,我有一个HTML表单,其中包含房间,到达日期,出发日期等各种字段.其中一个包含一个"客户列表",其中列出了已在数据库中的人员:

    <select size="5" name="client_list"> 
    {% for person in clients %}
        <option>{{ person.first|escape }} {{ person.last|escape }}</option>
    {% endfor %}
</select>
Run Code Online (Sandbox Code Playgroud)

这可以显示名称,但是我不知道如何将选定的 "Person"或客户端存储到Reservation中,代码如下:

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')
Run Code Online (Sandbox Code Playgroud)

我开始关注Keys(特别是db.Key.from_path),以及GAE中每个人如何生成一个唯一的ID,但是我仍然不知道如何从显示的列表中获取分配给某个人的唯一ID.如果所有显示的是人名,则为HTML.

这似乎是可能的,也可能是简单的,但经过两天的搜索,我什么都没有想出来.如果我应该提供更多信息,请告诉我,这是我在Stack Overflow上的第一篇文章!谢谢你的任何建议.

min*_*hee 5

根据文件:

存储在数据存储区中的每个模型实例都有一个表示对象的唯一键.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>
Run Code Online (Sandbox Code Playgroud)

指出该<option>元素有自己的value属性.并注意为什么我改变了<select>从元素的名称cleint_listclient的是,它不能选择多个项目,但只有一个项目.

然后,通过其密钥检索客户端实例.根据文件:

应用程序可以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
Run Code Online (Sandbox Code Playgroud)