基于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 |