我正在尝试使用绑定的源对象获取一个自动完成小部件以在表单(z3c.form)中呈现。
在接口类中:
Parent = schema.Choice(title=u'A Parent',
source=ParentSourceBinder(),
required=False,
default=None)
在我的表格中。表格类:
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,搜索功能。
当需要设置为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,如果没有在buildout中设置版本,这是默认版本。两个版本的radio.py都不同。当我将buildout.cfg中的版本设置为3.0.5时,表单呈现并且自动完成小部件使用所需的设置为False。 3.2.1给我留下了LookupError。
如何在不需要将true设置为true并同时使用版本3.2.1的情况下使自动完成小部件正常工作?
编辑: 我正在从plone.formwidget.autocomplete导入AutocompleteFieldWidget。 我使用的plone版本是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的输入时,小部件工作正常。