“dolmen.content”的crud表单和操作
dolmen.forms.crud的Python项目详细描述
添加视图
dolmen.forms.crud 为"添加"提供了一个抽象 行动。它允许在容器层和手柄处插入 命名和持久性。更明确地说,它是一个命名适配器 将查询添加表单,检查约束,选择名称(使用 最后,如果一切顺利,把它加到 语境:
基本添加视图在框外注册为命名可遍历的 名为"add"的适配器。它使用以下模式: ++添加++工厂名称。 工厂名称 必须是 dolmen.content.ifactory 组件。
我们首先创建一个容器,在其中测试添加视图:
>>> import dolmen.content >>> from dolmen.forms.crud.tests import Sietch >>> sietch = Sietch() >>> dolmen.content.IContent.providedBy(sietch) True >>> from zope.site.hooks import getSite >>> root = getSite() >>> root['sietch'] = sietch
创建容器后,添加视图应该可用,并且 可操作。让我们快速浏览一下:
>>> from zope.component import getMultiAdapter >>> from zope.publisher.browser import TestRequest >>> request = TestRequest() >>> addingview = getMultiAdapter((sietch, request), name='add') >>> addingview <dolmen.forms.crud.addview.Adder object at ...>
添加视图组件显式地检查安全需求 在工厂里。为了测试这种行为,我们设置了两个 账户。"zope.manager"在 "zope.manfred"只有"zope.view"凭据。我厂 显式要求"zope.managecontent"权限 打电话。让我们尝试使用manfred来访问它:
>>> import zope.security.management as security >>> from zope.security.testing import Principal, Participation >>> manager = Principal('zope.manager', 'Manager') >>> manfred = Principal('zope.manfred', 'Manfred') >>> security.newInteraction(Participation(manfred)) >>> addingview.traverse('fremen', []) Traceback (most recent call last): ... Unauthorized: <class 'dolmen.forms.crud.tests.Fremen'> requires the 'zope.ManageContent' permission. >>> security.endInteraction()
曼弗雷德没有被授权,但是经理应该能够 要访问添加视图:
>>> security.newInteraction(Participation(manager)) >>> addingview.traverse('fremen', []) Traceback (most recent call last): ... NotFound: Object: <dolmen.forms.crud.tests.Sietch object at ...>, name: 'fremen'
添加视图可用于我们的项目。不过,因为我们没有附加表格 注册后,如果尝试访问 当前工厂。
让我们创建并注册一个非常基本的通用crud 添加表单:
>>> import dolmen.forms.crud as crud >>> class AddForm(crud.Add): ... '''Generic add form. ... ''' >>> import grokcore.component >>> grokcore.component.testing.grok_component('addform', AddForm) True >>> addform = addingview.traverse('fremen', []) >>> addform <dolmen.forms.crud.tests.AddForm object at ...>
当我们走向工厂时,我们的addform被返回 "弗里曼"。
<>完美。我们的添加视图已经可以使用了。在测试addform之前 本身,让我们尝试一下 add 方法:>>> from dolmen.forms.crud.tests import Fremen >>> naib = Fremen() >>> added_item = addingview.add(naib) >>> added_item <dolmen.forms.crud.tests.Fremen object at ...>
创建的内容已正确定位并持久化:
>>> added_item.__name__ u'Fremen' >>> added_item.__parent__ is sietch True
事实上,一个iadding组件应该总是 可定位的您可以方便地访问位置信息:
>>> addingview.__parent__ <dolmen.forms.crud.tests.Sietch object at ...> >>> addingview.__name__ u''
add 方法检查是否遵守了约束。如果 容器已定义限制,或者如果某个接口协定是 违反,我们会得到一个错误:
>>> from dolmen.forms.crud.tests import Harkonnen >>> rabban = Harkonnen() >>> addingview.add(rabban) Traceback (most recent call last): ... InvalidItemType: (<...Sietch object at ...>, <...Harkonnen object at ...>, (<InterfaceClass dolmen.forms.crud.tests.IDesertWarrior>,))
adding视图的 add 方法可以从addform调用以委托 添加操作。泛型添加视图已经处理了 命名和持久化等操作。