跳转到主要内容

基于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.browserpageregisterType而不是来自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>&ndash; 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>&ndash; 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>

除非allowEditFalse。在这种情况下,编辑表单不会出现。

>>> 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 (23.6 kB 查看哈希值)

上传时间

由以下支持

AWSAWS 云计算和安全赞助商DatadogDatadog 监控FastlyFastly CDNGoogleGoogle 下载分析MicrosoftMicrosoft PSF赞助商PingdomPingdom 监控SentrySentry 错误日志StatusPageStatusPage 状态页面