首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无需重新运行GenericSetup /重新安装产品即可向plone.registry添加新记录

无需重新运行GenericSetup /重新安装产品即可向plone.registry添加新记录
EN

Stack Overflow用户
提问于 2013-03-13 00:32:10
回答 3查看 807关注 0票数 4

在Plone附加产品中,我有一个控制面板页面,可以在其中设置一些配置选项。它们存储在plone.registry中。控制面板适配器通过查询接口来获取其__init__方法中的不同字段,例如:

代码语言:javascript
复制
class MultiLanguageExtraOptionsAdapter(LanguageControlPanelAdapter):
    implementsOnly(IMultiLanguageExtraOptionsSchema)

    def __init__(self, context):
        super(MultiLanguageExtraOptionsAdapter, self).__init__(context)
        self.registry = getUtility(IRegistry)
        self.settings = self.registry.forInterface(
            IMultiLanguageExtraOptionsSchema)

现在,我向接口IMultiLanguageExtraOptionsSchema添加了一个额外的字段,并重新启动plone。在控制面板页面上,我出现了一个错误:

代码语言:javascript
复制
KeyError: 'Interface `plone.app.multilingual.interfaces.IMultiLanguageExtraOptionsSchema` defines a field `blah`, for which there is no record.'

(如plone.registry自述文件中所述,这对于forInterface方法是预期的。记录不在那里。)

当然,如果我通过GenericSetup (registry.xml)添加该字段,并重新安装产品/重新运行“控制面板”步骤,则一切都很好:

代码语言:javascript
复制
<registry>
 <records interface="plone.app.multilingual.interfaces.IMultiLanguageExtraOptionsSchema">
   <value key="blah"></value>
 <records>
<registry>

但我不想强迫用户重新安装产品,因为在特定于产品的控制面板中有一个新的选项。那么我的问题是:有没有推荐的方法将新字段的新记录放到plone.registry中?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-13 13:45:55

如果将False作为第二个参数传递给forInterface:

代码语言:javascript
复制
registry.forInterface(IMultiLanguageExtraOptionsSchema, False)

然后,如果模式中的字段在注册表中丢失,它就不会抛出错误,而只是返回字段的默认值。

票数 5
EN

Stack Overflow用户

发布于 2013-03-13 01:46:05

您可以尝试/捕获KeyError,然后确保所有注册表设置都已注册:

代码语言:javascript
复制
try:
    self.settings = self.registry.forInterface(IMultiLanguageExtraOptionsSchema)
except KeyError:
    registry = getUtility(IRegistry)
    registry.registerInterface(IMultiLanguageExtraOptionsSchema)

不过,我建议您编写一个升级步骤(当然,这将迫使您的用户重新安装产品)。

upgrades.py:

代码语言:javascript
复制
def update_registry(context):
    registry = getUtility(IRegistry)
    registry.registerInterface(IMultiLanguageExtraOptionsSchema)

upgrades.zcml::

代码语言:javascript
复制
  <genericsetup:upgradeStep
      source="*"
      destination="1100"
      title="Update plone.app.multilingual setting registry"
      description=""
      profile="plone.app.multilingual:default"
      handler=".upgrades.update_registry"
      />

看见

https://github.com/collective/collective.mailchimp/blob/master/collective/mailchimp/upgrades.py

https://github.com/collective/collective.mailchimp/blob/master/collective/mailchimp/upgrades.zcml

举个例子。

票数 7
EN

Stack Overflow用户

发布于 2013-09-20 22:31:47

安全地从注册表获取设置:

代码语言:javascript
复制
def get_registry_settings(interface, name):
    registry = getUtility(IRegistry)
    settings = registry.forInterface(interface, check=False)
    value = getattr(settings, name)
    if value == settings.__schema__[name].missing_value:
        value = settings.__schema__[name].default
    return value
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15366880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档