架构界面中的可选字段



我在 plone 插件中定义了这个用户模式,用于多个网站。

class IUser(Interface):
userid = schema.TextLine(
title=_("User id"),
required=True,
constraint=validate_userid,
)
email = schema.TextLine(
title=_(u"Email"),
required=True,
constraint=validate_email
)
optional_type = schema.Choice(
title=_(u"User type"),
vocabulary="user_types",
required=True,
)

有时需要optional_type字段,有时不需要。user_types保存在portal_vocabularies中。我希望该字段仅在词汇存在时使用,并且我希望在缺少定义时忽略它。

我的意思是,我希望此字段适用于使用它的网站,但用户架构在其他情况下也可以使用。目前我收到此错误:ComponentLookupError: (<InterfaceClass zope.schema.interfaces.IVocabularyFactory>, 'user_types').

我知道我可以创建一个空的未使用的词汇表,但是您在这里有更好的解决方案吗?

不可能,但您可以跳过错误并使字段看起来不存在。很高兴知道:

事实上,user_types不是词汇的名称,而是词汇的名称。 工厂(来源(

因此,您无需在portal_vocabularies中定义词汇即可解决此问题。只需定义一个工厂,例如:

foo.py

from zope.interface import provider
from zope.schema.interfaces import IVocabularyFactory
from zope.schema.vocabulary import SimpleTerm
from zope.schema.vocabulary import SimpleVocabulary

@provider(IVocabularyFactory)
def user_types_vocabulary(context):
items = [
('test1', u'Test value 1'),
('test2', u'Test value 2')
]
terms = [
SimpleTerm(value=pair[0], token=pair[0], title=pair[1])
for pair in items
]
return SimpleVocabulary(terms)

作为实用程序:

configure.zcml

<utility name="user_types"
component=".aaa.user_types_vocabulary" />

然后,您可以隐藏该字段,并在不需要的所有位置忽略它。

相关内容

  • 没有找到相关文章

最新更新