WTForm: как указать форме использовать пользовательский метод для одного конкретного атрибута?

У меня есть следующие определения:

class ProduceType(ndb.Model):
  crop = ndb.StringProperty()
  variety = ndb.StringProperty()

class OrderEntry(ndb.Model):
  producetype = ndb.KeyProperty(kind=ProduceType, required=True)
  quantity = ndb.IntegerProperty(required=True)

Я создал следующую WTForm:

class OrderEntryForm(Form):
  quantity = IntegerField('Quantity',
                          [validators.Required(), validators.NumberRange(min=1)])
  # we will be dynamically adding choices
  producetype = SelectField('Produce',
                            [validators.Required()],
                            choices=[])

Вот что я делаю в своих тестах:

def setUp(self):
  self.pt1 = ProduceType(crop='Choi', variety='Bok')
  self.pt2 = ProduceType(crop='Cress', variety='True')
  self.pt1.put()
  self.pt2.put()

def test_order_entry(self):
  oe = OrderEntry(producetype=self.pt1.key, quantity=20)
  oef = OrderEntryForm(obj=oe)
  oef.producetype.choices = [
      (self.pt1.key.id(), self.pt1.name()),
      (self.pt2.key.id(), self.pt2.name())
  ]
  print oef.producetype

И вот что печатается:

<select id="producetype" name="producetype"><option value="1">Choi - Bok</option><option value="2">Cress - True</option></select>

Проблема: я пытаюсь отобразить форму для редактирования пользователями.

Итак, если OrderEntry в моей базе данных выглядит так:

order_entry = { producetype: self.pt1.key, quantity: 5 } 

Я бы ожидал, что WTForms будет отображать что-то вроде:

<select id="producetype" name="producetype">
  <option value="1" selected>Choi - Bok</option>
  <option value="2">Cress - True</option>
</select>

Однако прямо сейчас я не могу заставить WTForm правильно отображать selected. Отображаемый выбор в настоящее время пуст.

Как заставить WTForm правильно отображать selected?

ПРИМЕЧАНИЕ:

Во время заполнения формы, то есть oef = OrderEntryForm(obj=oe), если WTForm попытается получить доступ к obj.producetype, это даст вам ndb.key. Как видите, первый член кортежа oef.producetype.choices имеет номер ndb.key.id(), а не ndb.key.


person disappearedng    schedule 20.06.2014    source источник
comment
Я думаю, что это граничит с проблемой XY (мета .stackexchange.com/questions/66377/what-is-the-xy-problem). Возможно, если бы я понял больше о том, что вы на самом деле пытаетесь сделать, я мог бы дать вам разумное решение.   -  person nsfyn55    schedule 20.06.2014
comment
@ nsfyn55 Теперь стало яснее?   -  person disappearedng    schedule 20.06.2014
comment
self.pt1.key должно быть строковым значением, соответствующим атрибуту value <option>. Есть ли способ преобразовать ndb.key.id() в строковое значение? Если вы не знаете, но думаете, что это возможно, это будет подходящий вопрос для поиска/задания по тегу appengine. В противном случае вы никогда не сможете преобразовать сложный ключ ndb в примитивный атрибут value поля формы.   -  person nsfyn55    schedule 20.06.2014
comment
@nsfyn55: хорошо, я узнал о formdata. По-видимому, я могу заполнить с помощью namedtuple   -  person disappearedng    schedule 20.06.2014
comment
formdata принудит формат проводника (а-ля '1' к 1), но сделает ли он это наоборот?   -  person nsfyn55    schedule 20.06.2014
comment
@ nsfyn55 Я сделал это в своем тестовом примере, и это сработало. order_entry_form = OrderEntryForm(quantity=oe.quantity, producetype=oe.producetype.id())   -  person disappearedng    schedule 20.06.2014