我正在尝试使用绑定的源对象获取自动完成小部件以表单(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。
我使用的plone版本是4.3.4.1
Update我发现 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 的输入时,小部件工作正常。