基于z3c.form和z3c.table的Zope3表单支持表
项目描述
此包提供了基于z3c.form和z3c.table的Zope3表格实现,包括表单支持。
问题
README.txt示例中仍存在一个问题,示例使用嵌套的<form>标签。修复示例并使用真正的子表单模板。
CHANGES
0.6.2 (2012-06-19)
让页模板提供宏,以便更容易替换特定内容
0.6.1 (2012-06-19)
修复了包元数据(主页和作者电子邮件)。
向TableBase添加默认支持cancel = False
0.6.0 (2010-10-28)
使用来自zope.browserpage的registerType而不是来自zope.app.pagetemplate
调整测试输出。
更新测试依赖项,以便测试与当前z3c.form版本一起运行。
将doctests添加到long_description中,以便在PyPI上显示。
0.5.2 (2009-10-19)
修复了0.5.1中引入的错误。
0.5.1 (2009-10-19)
向SubFormTable添加allowEdit属性
0.5.0 (2009-02-22)
初始发布。
表单表
此包的目标是提供一个模块化表格渲染库,其中包含对更新表单的内置支持。这允许我们将作为表格行项渲染的项目适应为表单。这可以防止使用可遍历的公开表单来处理此类项目。但这只是其中之一好处。下面将了解更多。
表单支持
首先需要设置表单默认值
>>> from z3c.form.testing import setupFormDefaults >>> setupFormDefaults()
然后加载表单ui配置,这将确保所有宏都正确注册。
>>> from zope.configuration import xmlconfig
>>> import zope.component
>>> import zope.viewlet
>>> import zope.component
>>> import zope.app.publisher.browser
>>> import z3c.macro
>>> import z3c.template
>>> import z3c.formui
>>> xmlconfig.XMLConfig('meta.zcml', zope.component)()
>>> xmlconfig.XMLConfig('meta.zcml', zope.viewlet)()
>>> xmlconfig.XMLConfig('meta.zcml', zope.app.publisher.browser)()
>>> xmlconfig.XMLConfig('meta.zcml', z3c.macro)()
>>> xmlconfig.XMLConfig('meta.zcml', z3c.template)()
>>> xmlconfig.XMLConfig('configure.zcml', z3c.formui)()
然后加载z3c.tabular configure.zcml
>>> import z3c.tabular
>>> xmlconfig.XMLConfig('configure.zcml', z3c.tabular)()
示例数据设置
让我们创建一个示例容器,我们可以将其用作可迭代的上下文
>>> from zope.container import btree >>> class Container(btree.BTreeContainer): ... """Sample container.""" ... __name__ = u'container' >>> container = Container()
并为容器设置父级
>>> root['container'] = container
并创建一个示例内容对象,我们将其用作容器项
>>> import zope.interface >>> import zope.schema >>> class IContent(zope.interface.Interface): ... """Content interface.""" ... ... title = zope.schema.TextLine(title=u'Title') ... number = zope.schema.Int(title=u'Number')>>> class Content(object): ... """Sample content.""" ... zope.interface.implements(IContent) ... def __init__(self, title, number): ... self.__name__ = title.lower() ... self.title = title ... self.number = number
现在设置一些项目
>>> container[u'first'] = Content('First', 1)
>>> container[u'second'] = Content('Second', 2)
>>> container[u'third'] = Content('Third', 3)
FormTable设置
FormTable为在表单内渲染项目提供子表单设置。让我们首先为我们的使用项目定义一个表单
>>> from z3c.form import form >>> from z3c.form import field >>> class ContentEditForm(form.EditForm): ... fields = field.Fields(IContent)
现在我们可以定义我们的FormTable,包括SelectedItemColumn
>>> from z3c.table import column >>> import z3c.tabular.table >>> class ContentFormTable(z3c.tabular.table.SubFormTable): ... ... subFormClass = ContentEditForm ... ... def setUpColumns(self): ... return [ ... column.addColumn(self, column.SelectedItemColumn, ... u'selectedItem', weight=1), ... ]
并支持我们的请求的div表单层
>>> from z3c.formui.interfaces import IDivFormLayer >>> from zope.interface import alsoProvides >>> from z3c.form.testing import TestRequest >>> request = TestRequest() >>> alsoProvides(request, IDivFormLayer)
现在我们可以渲染我们的表格。如您所见,SelectedItemColumn渲染一个链接,知道如何选择项目
>>> contentSubFormTable = ContentFormTable(container, request)
>>> contentSubFormTable.__name__ = 'view.html'
>>> contentSubFormTable.update()
>>> print contentSubFormTable.render()
<form action="http://127.0.0.1" method="post"
enctype="multipart/form-data" class="edit-form"
name="subFormTable" id="subFormTable">
<div class="viewspace">
<div>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">
<div>
<table class="contents">
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr class="even">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=first">first</a></td>
</tr>
<tr class="odd">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=second">second</a></td>
</tr>
<tr class="even">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=third">third</a></td>
</tr>
</tbody>
</table>
</div>
</td>
<td valign="top">
</td>
</tr>
</table>
</div>
</div>
<div>
<div class="buttons">
<input id="subFormTable-buttons-delete"
name="subFormTable.buttons.delete"
class="submit-widget button-field" value="Delete"
type="submit" />
<input id="subFormTable-buttons-edit"
name="subFormTable.buttons.edit"
class="submit-widget button-field" value="Edit"
type="submit" />
<input id="subFormTable-buttons-cancel"
name="subFormTable.buttons.cancel"
class="submit-widget button-field" value="Cancel"
type="submit" />
</div>
</div>
</form>
现在我们可以通过点击链接来选择一个项目。我们通过在请求中设置相关数据来模拟此操作
>>> selectRequest = TestRequest(form={
... 'subFormTable-selectedItem-0-selectedItems': 'second'})
>>> alsoProvides(selectRequest, IDivFormLayer)
>>> selectedItemTable = ContentFormTable(container, selectRequest)
>>> selectedItemTable.__name__ = 'view.html'
>>> selectedItemTable.update()
>>> print selectedItemTable.render()
<form action="http://127.0.0.1" method="post" enctype="multipart/form-data" class="edit-form" name="subFormTable" id="subFormTable">
<div class="viewspace">
<div>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">
<div>
<table class="contents">
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr class="even">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=first">first</a></td>
</tr>
<tr class="selected odd">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=second">second</a></td>
</tr>
<tr class="even">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=third">third</a></td>
</tr>
</tbody>
</table>
</div>
</td>
<td valign="top">
<div class="tableForm">
<form action="http://127.0.0.1" method="post" enctype="multipart/form-data" class="edit-form" name="form" id="form">
<div class="viewspace">
<div class="required-info">
<span class="required">*</span>– required
</div>
<div>
<div id="form-widgets-title-row" class="row required">
<div class="label">
<label for="form-widgets-title">
<span>Title</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<input id="form-widgets-title" name="form.widgets.title" class="text-widget required textline-field" value="Second" type="text" />
</div>
</div>
<div id="form-widgets-number-row" class="row required">
<div class="label">
<label for="form-widgets-number">
<span>Number</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<input id="form-widgets-number" name="form.widgets.number" class="text-widget required int-field" value="2" type="text" />
</div>
</div>
</div>
</div>
<div>
<div class="buttons">
<input id="form-buttons-apply" name="form.buttons.apply" class="submit-widget button-field" value="Apply" type="submit" />
</div>
</div>
</form>
</div>
</td>
</tr>
</table>
</div>
</div>
<div>
<div class="buttons">
<input id="subFormTable-buttons-delete" name="subFormTable.buttons.delete" class="submit-widget button-field" value="Delete" type="submit" />
<input id="subFormTable-buttons-edit" name="subFormTable.buttons.edit" class="submit-widget button-field" value="Edit" type="submit" />
<input id="subFormTable-buttons-cancel" name="subFormTable.buttons.cancel" class="submit-widget button-field" value="Cancel" type="submit" />
</div>
</div>
</form>
同时点击编辑按钮应产生相同的结果
>>> selectRequest = TestRequest(form={
... 'subFormTable-selectedItem-0-selectedItems': 'second',
... 'subFormTable.buttons.edit': 'Edit'})
>>> alsoProvides(selectRequest, IDivFormLayer)
>>> selectedItemTable = ContentFormTable(container, selectRequest)
>>> selectedItemTable.__name__ = 'view.html'
>>> selectedItemTable.update()
>>> print selectedItemTable.render()
<form action="http://127.0.0.1" method="post" enctype="multipart/form-data" class="edit-form" name="subFormTable" id="subFormTable">
<div class="viewspace">
<div>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">
<div>
<table class="contents">
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr class="even">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=first">first</a></td>
</tr>
<tr class="selected odd">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=second">second</a></td>
</tr>
<tr class="even">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=third">third</a></td>
</tr>
</tbody>
</table>
</div>
</td>
<td valign="top">
<div class="tableForm">
<form action="http://127.0.0.1" method="post" enctype="multipart/form-data" class="edit-form" name="form" id="form">
<div class="viewspace">
<div class="required-info">
<span class="required">*</span>– required
</div>
<div>
<div id="form-widgets-title-row" class="row required">
<div class="label">
<label for="form-widgets-title">
<span>Title</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<input id="form-widgets-title" name="form.widgets.title" class="text-widget required textline-field" value="Second" type="text" />
</div>
</div>
<div id="form-widgets-number-row" class="row required">
<div class="label">
<label for="form-widgets-number">
<span>Number</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<input id="form-widgets-number" name="form.widgets.number" class="text-widget required int-field" value="2" type="text" />
</div>
</div>
</div>
</div>
<div>
<div class="buttons">
<input id="form-buttons-apply" name="form.buttons.apply" class="submit-widget button-field" value="Apply" type="submit" />
</div>
</div>
</form>
</div>
</td>
</tr>
</table>
</div>
</div>
<div>
<div class="buttons">
<input id="subFormTable-buttons-delete" name="subFormTable.buttons.delete" class="submit-widget button-field" value="Delete" type="submit" />
<input id="subFormTable-buttons-edit" name="subFormTable.buttons.edit" class="submit-widget button-field" value="Edit" type="submit" />
<input id="subFormTable-buttons-cancel" name="subFormTable.buttons.cancel" class="submit-widget button-field" value="Cancel" type="submit" />
</div>
</div>
</form>
除非allowEdit为False。在这种情况下,编辑表单不会出现。
>>> selectRequest = TestRequest(form={
... 'subFormTable-selectedItem-0-selectedItems': 'second',
... 'subFormTable.buttons.edit': 'Edit'})
>>> alsoProvides(selectRequest, IDivFormLayer)
>>> selectedItemTable = ContentFormTable(container, selectRequest)
>>> selectedItemTable.__name__ = 'view.html'
>>> selectedItemTable.allowEdit = False
>>> selectedItemTable.update()
>>> print selectedItemTable.render()
<form action="http://127.0.0.1" method="post"
enctype="multipart/form-data" class="edit-form"
name="subFormTable" id="subFormTable">
<div class="viewspace">
<div>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">
<div>
<table class="contents">
<thead>
<tr>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr class="even">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=first">first</a></td>
</tr>
<tr class="selected odd">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=second">second</a></td>
</tr>
<tr class="even">
<td><a href="http://127.0.0.1/container/view.html?subFormTable-selectedItem-0-selectedItems=third">third</a></td>
</tr>
</tbody>
</table>
</div>
</td>
<td valign="top">
</td>
</tr>
</table>
</div>
</div>
<div>
<div class="buttons">
<input id="subFormTable-buttons-delete"
name="subFormTable.buttons.delete"
class="submit-widget button-field" value="Delete"
type="submit" />
<input id="subFormTable-buttons-cancel"
name="subFormTable.buttons.cancel"
class="submit-widget button-field" value="Cancel"
type="submit" />
</div>
</div>
</form>
项目详情
z3c.tabular-0.6.2.zip 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 5e135601da0e9b79e6b37b1dd46c4172d29f475c2b9d3207968fe6c09ca7c056 |
|
| MD5 | 3d24962de2481beb8fd1b4c6596b70d9 |
|
| BLAKE2b-256 | b60a47e661c2e44fcc6d8107d71c457f1e95aec5e01114ca9c8cc5e7bcf562b1 |