跳转到主要内容

为给定的域类自动生成CRUD表单。

项目描述

简介
============

脚手架允许您自动为模型生成表单。目标是创建
常用表单,同时仍然允许进行更深入的
自定义。

.. 内容:

在我们开始使用脚手架之前,我们必须创建要与之一起工作的内容

模型
------

>>> import grokcore.component as grok
>>> from zope.interface import Interface
>>> from zope import schema

>>> class IMammoth(Interface)
... name = schema.TextLine(title=u"名称")
... age = schema.Int(title=u"年龄")

>>> class Mammoth(Model)
... grok.implements(IMammoth)
... name = schema.fieldproperty.FieldProperty(IMammoth['name'])
... age = schema.fieldproperty.FieldProperty(IMammoth['age'])

>>> class HerdContainer(Container)
... pass

现在我们只需要创建一个控制器

几行代码构建整个应用程序
--------------------------------

>>> from megrok.scaffold import Controller, scaffold

>>> class MammothController(Controller)
... grok.context(HerdContainer)
...
... scaffold(Mammoth)

这就对了。我们现在有一个添加表单、编辑表单、显示“表单”和列表
视图。并启用了删除功能。

让我们验证一下。

理解与查询
---------------------

我们让Grok注册组件:

>>> grok_component('mammothcontroller', MammothController)
True

现在,我们可以正常查询它:

>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> herd = HerdContainer()
>>> getRootFolder()['herd'] = herd
>>> manfred = Mammoth()
>>> herd['manfred'] = manfred

>>> from zope.component import getMultiAdapter
>>> editform = getMultiAdapter((manfred, request), name="edit")

>>> editform
<EditForm 'edit'>
>>> print editform()
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<div id="edit-mammoth" class="scaffold-edit">
<form action="http://127.0.0.1" method="post"
class="edit-form" enctype="multipart/form-data">
...

>>> displayform = getMultiAdapter((manfred, request), name="index")
>>> displayform
<DisplayForm 'index'>

>>> addform = getMultiAdapter((herd, request), name="addmammoth")
>>> addform
<AddForm 'addmammoth'>

>>> listform = getMultiAdapter((herd, request), name="listmammoth")
>>> listform
<ListForm 'listmammoth'>

布局集成
------------------

首先,让我们注销之前的表单以重新开始:

>>> from zope.component import getGlobalSiteManager
>>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
>>> from zope.interface import implementedBy
>>> sm = getGlobalSiteManager()
>>> def unregister_views()
... done = sm.unregisterAdapter(None, (implementedBy(Mammoth),
... IDefaultBrowserLayer), Interface, 'edit')
... done = done and sm.unregisterAdapter(None, (implementedBy(Mammoth),
... IDefaultBrowserLayer), Interface, 'index')
... done = done and sm.unregisterAdapter(None, (implementedBy(HerdContainer),
... IDefaultBrowserLayer), Interface, 'addmammoth')
... done = done and sm.unregisterAdapter(None, (implementedBy(HerdContainer),
... IDefaultBrowserLayer), Interface, 'listmammoth')
... return done
>>> unregister_views()
True

现在,像往常一样简单地定义布局:

>>> from megrok.layout import Layout
>>> class MyLayout(Layout)
... grok.name('mylayout')
... grok.context(Interface)
...
... def render(self)
... return u"A simple layout\n%s" % self.view.content()
>>> grok_component('MyLayout', MyLayout)
True

然后告诉脚手架Grokker注册表单为布局页面:

>>> class MammothController(Controller)
... grok.context(HerdContainer)
...
... scaffold(Mammoth, aspage=True)

>>> grok_component('mammothcontroller', MammothController)
True
>>> editform = getMultiAdapter((manfred, request), name="edit")
>>> print editform()
A simple layout
<div id="edit-mammoth" class="scaffold-edit">
<form action="http://127.0.0.1" method="post"
class="edit-form" enctype="multipart/form-data">
...

定制
=============

可以使用传递给scaffold指令的参数配置视图的名称,例如:

>>> class MammothController(Controller)
... grok.context(HerdContainer)
...
... scaffold(Mammoth, addname='add', editname='edit', displayname='index', listname='index')

除此之外,还可以设置每个表单使用的接口:

>>> class IListMammoth(Interface)
... name = schema.TextLine(title=u"Mammoth's name")

>>> class MammothController(Controller)
... grok.context(HerdContainer)
...
... scaffold(add=Mammoth, edit=IMammoth, list=IListMammoth, display=IMammoth)

可以很容易地禁用视图的自动注册:

>>> class MammothController(Controller)
... grok.context(HerdContainer)
...
... scaffold(Mammoth, list=False)

将所有这些组合起来:

>>> class MammothController(Controller)
... grok.context(HerdContainer)
...
... scaffold(Mammoth, list=IListMammoth, listname='index', edit=False, aspage=True)

后者将注册:

- 一个名为模型名称的添加表单('addmammoth')
- 一个名为'index'的显示表单
- 一个名为'index'的列表视图,显示IListMammoth中定义的字段
- 没有编辑表单

>>> unregister_views()
True
>>> grok_component('mammothcontroller', MammothController)
True
>>> getMultiAdapter((herd, request), name="index")
<ListForm 'index'>
>>> editform = getMultiAdapter((manfred, request), name="edit")
Traceback (most recent call last)
...
ComponentLookupError

操作
-------

每个表单都有这些常见操作的子集:'add'、'edit'、'apply'、'delete'。
可以使用如'allow_edit'和'allow_delete'之类的属性激活或禁用某些操作。

可以使用formlib的操作装饰器创建自己的自定义操作:

>>> from grokcore.formlib import action

>>> class MammothController(Controller)
... grok.context(HerdContainer)
...
... scaffold(Mammoth, listname='index')
...
... allow_delete = False
...
... @action('Cancel')
... def cancel(self, **data)
... pass
...
... list_actions = Controller.list_actions.copy()
...
... @action('Import', list_actions)
... def do_import(self, **data)
... self.redirect(self.url(self.context, 'import_view'))

>>> unregister_views()
True
>>> grok_component('mammothcontroller', MammothController)
True
>>> listform = getMultiAdapter((herd, request), name="index")
>>> html = listform()
>>> print listform() # doctest: +NORMALIZE_WHITESPACE
1
<input type="submit" class="button" value="Import" name="actions.import" id="actions.import">

安全
========

默认情况下,已注册的视图没有设置权限。要更改,请使用
megrok.scaffold的'require'指令:

>>> from megrok.scaffold import require as scaffold_require

>>> class MammothController(Controller)
... grok.context(HerdContainer)
...
... scaffold(Mammoth)
... scaffold_require(add='zope.ManageContent', edit='zope.ManageContent')

API
===

请参阅interfaces.py模块。

变更日志
=========

0.3
-----------------

- 列表视图表现在使用字段的标题作为列标题
- 修复了Controller默认添加方法上的bug(缩进错误)
- 修改了Controller __init__的签名
- 删除了megrok.layout依赖。现在可以包含megrok.layout或
grokcore.layout。
- 控制器现在作为工具注册


0.2
------------------

- 修复了布局页面的模板(aspage=True)
- 修复了少量bug

0.1
-------------------

- 首次发布

项目详情


下载文件

下载您平台上的文件。如果您不确定要选择哪一个,请了解更多关于安装包的信息。

源分布

megrok.scaffold-0.3.tar.gz (16.4 kB 查看散列)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面