Python 在灵巧表单中设置另一个字段后,动态更改一个字段的下拉选项

Python 在灵巧表单中设置另一个字段后,动态更改一个字段的下拉选项,python,sql,forms,plone,dexterity,Python,Sql,Forms,Plone,Dexterity,在dextrity form.Schema中设置另一个字段后,我无法动态更改一个字段的下拉选项 词汇表基于sql数据库 具体来说,我想在选择县后更新乡镇的词汇选项 现在,我只是拉了一个完整的乡镇名单,不管选择哪个国家。因为所有动态改变事物的尝试都会导致错误 在此方面的任何帮助都将不胜感激。谢谢 从site.py: from selectionProvider import SelectionProvider vocabProvider = SelectionProvider() @grok.p

在dextrity form.Schema中设置另一个字段后,我无法动态更改一个字段的下拉选项

词汇表基于sql数据库

具体来说,我想在选择县后更新乡镇的词汇选项

现在,我只是拉了一个完整的乡镇名单,不管选择哪个国家。因为所有动态改变事物的尝试都会导致错误

在此方面的任何帮助都将不胜感激。谢谢

从site.py:

from selectionProvider import SelectionProvider
vocabProvider = SelectionProvider()

@grok.provider(IContextSourceBinder)
def countySource(context):
    return vocabProvider.getVocabulary('county')

@grok.provider(IContextSourceBinder)
def townshipSource(context):
    return vocabProvider.getVocabulary('township')

class IESurrenderSite(form.Schema):

    county = schema.Choice(
        title=_(u"County"),
        source=countySource,
        required=True,
    )

    township = schema.Choice(
        title=_(u"Township"),
        source=townshipSource,
        required=True,
    )

从selectiorProvider.py:

class SelectionProvider(object):

DB = maap_db.maap_db()
vocabularies = {}
Counties = {}
Townships = {}

def getCountiesDropdownRecordSet(self, object):
    """input:object is a string
    """
    print 'in getCountiesDropdownRecordSet'
    self.DB.open()

    rs = self.DB.RunQuery("Select *, CountyID as [value], name as [title] From County Order By name;")

    self.DB.close()
    SelectionProvider.CountiesByName = {}
    for rec in rs:

        SelectionProvider.CountiesByName[rec['CountyID']] = rec['title']
    #

    return rs

def getTownshipDropdownRecordSet(self, object):
    """input:object is a string
    """
    print 'in getTownshipDropdownRecordSet'
    self.DB.open()

    rs = self.DB.RunQuery("Select *, TownshipID as [value], name as [title] From Township Order By name;")

    self.DB.close()
    SelectionProvider.TownshipsByName = {}
    for rec in rs:
        SelectionProvider.TownshipsByName[rec['TownshipID']] = rec['title']
    #

    return rs

# #
def getDropdownRecordSet(self, object):
    """input:object is a string
    """
    print 'in getDropdownRecordSet'
    self.DB.open()
    rs = self.DB.RunQuery("Select * From DropdownSelections Where object = '%s' Order By seqNo;" % (object))
    self.DB.close()

    return rs


def buildVocabulary(self, rs, valueField='value', titleField='title'):
    """DO NOT USE directly outside this class, see getVocabulary() or rebuildVocabulary() instead
    """
    data = []
    for rec in rs:
        data.append(SimpleTerm(value=rec[valueField], title=_(rec[titleField])))
    #
    return SimpleVocabulary(data)
#

def rebuildVocabulary(self, object):
    """Force a fetch from the database and rebuild the vocabulary.
    input object: a string, matches the DropdownSelections field
    """
    print 'initializing %s' % (object)

    if object=="county":
        print 'going to CountiesDropdowns'
        vocab = self.buildVocabulary(self.getCountiesDropdownRecordSet(object), "CountyID","title")
        SelectionProvider.vocabularies[object] = vocab

        return vocab

    if object=="township":
        print 'going to TownshipDropdowns'
        vocab = self.buildVocabulary(self.getTownshipDropdownRecordSet(object), "TownshipID","title")
        SelectionProvider.vocabularies[object] = vocab
        #print _SITE_NAME, '%s selection list initialized.' % (object)
        return vocab     
    else:

        vocab = self.buildVocabulary(self.getDropdownRecordSet(object))
        SelectionProvider.vocabularies[object] = vocab
        return vocab


def getVocabulary(self, object):
    """Retrieve cached vocabulary
    input object: a string, matches the DropdownSelections field
    """
    recreate = False
    if not SelectionProvider.vocabularies.has_key(object):
        recreate = True
    #
    vocab = SelectionProvider.vocabularies.get(object)
    if vocab == None or len(vocab) == 0:
        recreate = True
    #
    if recreate:
        vocab = self.rebuildVocabulary(object)
    #
    return vocab
你可以用它来做这个 如下所示(未经测试,但能让您对其工作原理有一个大致了解):


这是一个仅链接的答案,请提供一个简单的(可能是伪代码)示例,说明他如何在自己的具体案例中使用它。是的,在玩了masterselect之后,我能够做我需要的事情。谢谢你的信息!
from zope import schema
from plone.supermodel import model
from plone.formwidget.masterselect import _
from plone.formwidget.masterselect import MasterSelectBoolField
from plone.formwidget.masterselect import MasterSelectField


def getTownshipDynVocab(master):
    CountryID = master_value

    # search for your township entries by CountryID
    # and return it as a DisplayList
    return townshipDynamicVocab


class IESurrenderSite(model.Schema):

    county = MasterSelectField(
        title=_(u"County"),
        source=countySource,
        slave_fields=(
            # Controls the vocab of township
            {'name': 'township',
             'action': 'vocabulary',
             'vocab_method': getTownshipDynVocab,
            },
        ),
        required=True,
    )

    township = schema.Set(
        title=_(u"Township"),
        value_type=schema.Choice(),
        required=False,
    )