模式界面中的可选字段
Optional field in schema interface
我在 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').
我知道我可以创建一个空的未使用的词汇表,但是你有更好的解决方案吗?
不可能,但您可以跳过该错误并让事情看起来像该字段不存在。很高兴知道:
in fact user_types
is not the name of a vocabulary but the name of a vocabulary
factory (source)
所以不用在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" />
然后你可以隐藏这个字段,在不需要的地方忽略它。
我在 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').
我知道我可以创建一个空的未使用的词汇表,但是你有更好的解决方案吗?
不可能,但您可以跳过该错误并让事情看起来像该字段不存在。很高兴知道:
in fact
user_types
is not the name of a vocabulary but the name of a vocabulary factory (source)
所以不用在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" />
然后你可以隐藏这个字段,在不需要的地方忽略它。