模式界面中的可选字段

时间:2018-10-01 15:20:15

标签: plone plone-4.x

我在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').

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

1 个答案:

答案 0 :(得分:1)

不可能,但是您可以跳过该错误,使情况看起来像该字段不存在。提示:

  

实际上user_types不是词汇表的名称,而是词汇表的名称   工厂(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" />

然后您可以隐藏该字段,并在不需要的地方忽略它。