1

我正在尝试启用一个用例“添加城市”,在该用例中,我获得了城市所属区域的区域和城市的模型定义:

class Region(db.Model):
  name = db.StringProperty()
  vieworder = db.IntegerProperty()
  image = db.BlobProperty()

class City(db.Model):
  region = db.ReferenceProperty()
  name = db.StringProperty()
  image = db.BlobProperty()
  vieworder = db.IntegerProperty()
  areacode = db.IntegerProperty()

然后我手动添加区域并制作了一个表格来添加城市:

class AddCityForm(Form):

    my_choices = [
        ('0', _('All regions')),
        ('1', _('Delhi')),
    ]
    region = SelectField(choices=my_choices)
    name = TextField(_('Name'))

class AddCityHandler(BaseRequestHandler):

    def get(self):
        logging.info('i baserequesthandler')
        self.render('addcity.html', {'form': AddCityForm()})

现在我希望选择从数据层读取,并且是所有区域Region.all(),ID 是实体的 ID,以便我可以使用区域的键作为它所属区域的参考来填充城市。你能告诉我如何让 WTForms 用我的区域填充数据存储中的选项吗?

谢谢你

更新

在 GAE 中,以下代码用于从数据存储区读取选项

class RegionField(SelectField):

    def __init__(self, *args, **kwargs):
        super(RegionField, self).__init__(*args, **kwargs)
        self.choices = []
        for region in Region.all().fetch(99999):
        self.choices.append([region.key().id(), region.name])

class AddCityForm(Form):
    region = RegionField()
    name = TextField(_('Name'))
4

1 回答 1

4

您可以将 SelectField 子类化:

class RegionField(SelectField):

    def __init__(self, *args, **kwargs):
        super(RegionField, self).__init__(*args, **kwargs)
        # a sample sqlalchemy query that returns a list of tuples (id, name)
        self.choices = models.Session.query(models.Region.id, models.Region.name).order_by(models.Region.name).all()

class AddCityForm(Form):
    region = RegionField()
    name = TextField(_('Name'))

请注意,根据持久层的操作方式,您可能还需要实现populate_obj(self, obj, name)以将提交的数据强制转换为您的 ORM 可以理解的内容(这对于 SelectMultipleField 来说更可能是必需的)。

于 2012-04-29T02:58:42.807 回答