2

我正在尝试使用绑定的源对象让自动完成小部件以表单(z3c.form)呈现。

在接口类中:

Parent = schema.Choice(title=u'A Parent',
                       source=ParentSourceBinder(),
                       required=False,
                       default=None)

在我的 form.Form 类中:

fields['Parent'].widgetFactory = AutocompleteFieldWidget    

我正在使用自定义源绑定器,因为我需要从数据库中提取数据。

class ParentSource(object):
    implements(IQuerySource)

    vocabulary = SimpleVocabulary([])
    session = None
    __iter__ = vocabulary.__iter__

    def __init__(self, context):
        self.context=context
        if self.session is None:
            db_utility = queryUtility(IMyDBUtility,name="MyDBUtility")
            self.session = db_utility.session
        self.vocabulary = SimpleVocabulary([SimpleTerm(title='temp',value='temp',token='temp'),])

然后我有__contains__、getTerm、getTermByToken、搜索功能。

当 required 设置为 false 并且我尝试加载表单时,我收到一个错误:LookupError:--NOVALUE--,它指向在 zope.schema.vocabulary 的 SimpleVocabulary 中找到的 getTermByToken。

修补 zope.schema.vocabulary 的 SimpleVocabulary 中的 getTermByToken 函数,我能够确定问题与 z3c.form.browser.radio 有关,AutocompleteFieldWidget 确实使用了无线电集。

我有两个可用的 z3c.form 版本,3.0.5 和 3.2.1,如果未在构建中设置版本,则这是默认版本。两个版本的radio.py 是不同的。当我将 buildout.cfg 中的版本设置为 3.0.5 时,表单呈现并且自动完成小部件在 required 设置为 False 的情况下工作。3.2.1 给我留下了 LookupError。

如何让自动完成小部件工作而无需将 required 设置为 true 并同时使用 3.2.1 版本?

编辑:我正在从 plone.formwidget.autocomplete 导入 AutocompleteFieldWidget。我使用的克隆版本是 4.3.4.1

更新 我在 3.0.5 和 3.2.1 的 radio_input.pt 文件中发现了一些有趣的东西 呈现小部件的行是不同的。

3.0.1 有:

   input tal:replace="structure python:view.renderForValue(item['value'])"

3.2.1 有:

   input id="" name="" class="" alt="" title=""
   tabindex="" disabled="" readonly="" accesskey="" value=""
   checked="" type="radio"
   tal:define="checked item/checked"
   tal:attributes="id item/id;
                   name item/name;
                   class view/klass;
                   value item/value;
                   style view/style;
                   title view/title;
                   lang view/lang;
                   ...

当我用 3.0.5 的输入替换 3.2.1 的输入时,小部件工作正常。

4

0 回答 0