2011-07-12 19 views
5

我们有一个敏捷内容类型要求从导航行为中排除,但exclude_from_nav字段的默认值为True。在行为plone.app.dexterity.behaviors.exclfromnav.IExcludeFromNavigation它默认为False你如何覆盖Plone灵巧行为中的一个字段的默认值?

很明显,我可以创建自己的行为,复制IExcludeFromNavigation除了默认值,但我想知道是否有办法做到这一点基础上重用IExcludeFromNavigation。我们有其他类型的内容使用IExcludeFromNavigation,我们希望它默认为False

我们正在使用的Plone 4.1rc3和敏捷1.0

回答

3

我有这个工作使用plone.directives.form装饰。

我已将此添加到我的某个行为模块中。

from plone.directives.form import default_value 

@default_value(field = IExcludeFromNavigation['exclude_from_nav']) 
def excludeFromNavDefaultValue(data): 
    return data.request.URL.endswith('++add++my_item_type') 

我也有在configure.zcml中以下

<include package="plone.directives.form" file="meta.zcml" /> 
<include package="plone.directives.form" /> 

<grok:grok package="." /> 

感谢Martin的大线索,尽管他的回答并没有完全解决我的问题。这对我来说有点像黑客 - 一个更优雅的解决方案会很好。

+0

另一个选择是注册一个自定义添加表单,然后使用'表单'(或者它是'视图'? )discriminator to default_value()来指定仅用于该表单的覆盖。 – optilude

+0

谢谢,我用这个我的场景,我有两个不同的对象类型在默认情况下我想排除在同一个容器中。问题是我不能把两个对象定义相同的装饰器,否则我会得到配置冲突的抱怨。我结束了刚刚声明的类型之一:: return data.request.URL.endswith('++ add ++ my_item_type')或data.request.URL.endswith('++ add ++ my_other_type') –

+0

和就像你的例子,我不得不删除上下文参数为它工作...确实似乎hacky。 –

5

http://plone.org/products/dexterity/documentation/manual/developer-manual/advanced/defaultshttp://pypi.python.org/pypi/plone.directives.form#value-adapters,但基本上是:

@form.default_value(field=IExcludeFromNavigation['exclude_from_nav'], context=IMyType) 
def excludeFromNavDefaultValue(data): 
    return True 

干杯, 马丁

+0

Martin。谢谢你的回答,但这不是我所追求的。我可能是错的,但是'context'似乎是你添加项目的容器,我需要一个基于添加项目类型的规则。我可以使用'data.request.URL'测试看到一个丑陋的黑客攻击,但更优雅的事情会更好 – scarba05