为给定的域类自动生成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
-------------------
- 首次发布
============
脚手架允许您自动为模型生成表单。目标是创建
常用表单,同时仍然允许进行更深入的
自定义。
.. 内容:
在我们开始使用脚手架之前,我们必须创建要与之一起工作的内容
模型
------
>>> 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的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | b2d21554ea61b002acb33d751c8ca6611e69c60748fadc8cb23a0d76f8a08739 |
|
MD5 | 7d0017d8eea9fcd8ca3540f472a070b5 |
|
BLAKE2b-256 | f626409609abab6e0db3f0755de379398c834fe0acb061a8790c777fb73ff657 |