如何在FormAlchemy中创建级联选择框?

时间:2012-09-25 09:08:00

标签: python pyramid formalchemy

我不知道如何在FormAlchemy中创建级联选择框。就像地址选择表格一样,我们有四个类:

class Country(Base, DBBase):
    __tablename__ = 'countries'

    id = Column(Integer, primary_key = True)
    name = Column(String)

    def __init__(self, name):
        self.name = name


class Province(Base, DBBase):
    __tablename__ = 'provinces'

    id = Column(Integer, primary_key = True)
    country_id = Column(Integer, ForeignKey('countries.id'), nullable = True)
    country = relationship('Country', backref = 'provinces')
    name = Column(String)

    def __init__(self, country, name):
        self.country = country
        self.name = name


class City(Base, DBBase):
    __tablename__ = 'cities'

    id = Column(Integer, primary_key = True)
    province_id = Column(Integer, ForeignKey('provinces.id'), nullable = True)
    province = relationship('Province', backref = 'cities')
    name = Column(String)

    def __init__(self, province, name):
        self.province = province
        self.name = name


class District(Base, DBBase):
    __tablename__ = 'districts'

    id = Column(Integer, primary_key = True)
    city_id = Column(Integer, ForeignKey('cities.id'), nullable = True)
    city = relationship('City', backref = 'districts')
    name = Column(String)

    def __init__(self, city, name):
        self.city = city
        self.name = name

当用户从第一级选择框中选择一个选项(这里是国家/地区字段)时,第二级选择框应该列出所有属于相应的第一级选择框(如果在'country'字段中选择US,'省/ state'字段应显示所有属于美国的州)。第三级和第四级框就是这样的。 所有数据都像上面的四个类一样排序。 问题是如何在FormAlchemy中制作这样的表格?

1 个答案:

答案 0 :(得分:1)

我将在此假设您要构建一个由JavaScript动态加载的表单。从本质上讲,你说二级到四级是空的,直到选择了上面的级别。

这实际上取决于这里的前端用法,但我将提供一个简单的解决方案,只需重新加载整个表单。您可以轻松地将其修改为更加动态,以获得更好的体验。

您要做的是构建一个表单,在该表单中您不知道尚未选择上述级别的那些选择框内的内容。假设你有一个国家的第一级(例如'美国')然后是第二级显示省份列表(在这种情况下是美国的所有州)。

现在,您的用户应该只能看到一个用于首先选择国家/地区的框。

构建表单以包含所有字段(即所有级别),但除第一个之外的所有字段都是空的。然后用户选择第一级。提交表单,但现在因为您拥有第一级,您可以使用第二级数据构建表单(例如,从您的模型获取美国的所有州)。然后将其传递给FormAlchemy。然后将该表单发回给用户。他选择第二级,然后再次从模型构建列表并将其传递给表单。这种情况一直持续到每个级别都建立起来。

因此,您的表单包含所有字段,但它们都是空的,但第一个。每次提交表单时,您都要检查哪些级别存在并从模型中检索这些级别。这是这种方法的本质。在FormAlchemy中实现它就像构建任何表单一样简单。

注意:您需要一次又一次地将表单提交到同一视图,并且每次都需要检查数据是否完整。

我不会在这里给出一个例子,因为问题是针对一般方法而不是一些特殊的FormAlchemy语法。

相关问题