我正在尝试使用绑定的源对象让自动完成小部件以表单(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 的输入时,小部件工作正常。