一组用于与z3c.form和Plone一起使用的部件、模板和其他组件
项目描述
z3c.form的Plone特定集成和HTML标记。
这是一个Plone核心包。
简介
此Plone包旨在为希望在Python代码中创建表单的开发者提供帮助。
请阅读关于 z3c.form 的文档,其中包含了在 Zope 2 中使用 z3c.form 的相关信息。该文档包主要包含您需要了解的“活动”部分,而本包提供与 Plone 集成的“被动”覆盖。
功能
以下添加了 Plone 和 z3c.form 集成:
Plone main_template.pt 集成
Plone 特定的小部件框架
日期/时间选择器
所见即所得小部件(带有 Plone 支持的 TinyMCE 视觉编辑器)
CRUD 表单
开箱即用的表单模板
表单和小部件模板按照以下顺序应用:
plone.app.z3cform 特定
plone.z3cform 特定
z3c.form 特定
plone.app.z3cform 包覆盖了来自 plone.z3cform 的 @@ploneform-macros 视图,使用标准 Plone 标记来定义表单字段、字段集等。
plone.z3cform 中描述的所有宏仍然可用。此外,您可以使用 widget_rendering 宏渲染所有默认小部件,但不能渲染字段集(分组)或字段集标题(使用 fields 宏渲染)。
每个小部件都使用 @@ploneform-render-widget 视图进行渲染,默认情况下包括小部件的标签、必填指示器、描述、错误以及 widget.render() 的结果。可以覆盖此视图以针对特定小部件类型进行自定义。
自定义表单行为
表单方法
如果您的表单实例定义了一个名为 method 的属性,则可以设置表单是 HTTP POST 还是 HTTP GET。默认为 POST。这对应于 <form method="post"> 属性。
示例
class HolidayServiceSearchForm(form.Form): """ Example search form of which results can be bookmarked. Bookmarking is possible because we use HTTP GET method. """ method = "get"
表单操作
表单 action 属性定义了表单提交的 HTTP 目标。默认值是表单渲染的同一页面,request.getURL()。
示例
class HolidayServiceSearchForm(form.Form): def action(self): """ Redefine <form action=''> attribute. We use URL fragment to define the <a> anchor were we directly scroll at the results when the form is posted, skipping unnecessary form fields part. The user can scroll back there if he/she wants modify the parameters. """ # Context item URL + form view name + link fragment. # This works for HTTP GET forms only. # Note that we cannot use request.getURL() as it might contain # 1) prior fragment 2) GET query parameters messing up the UrL return self.context.absolute_url() + "/holidayservice_view" + "#searched"
字段集和选项卡
如果您从 z3c.form.group.GroupForm 继承表单,则可以将字段集添加到您的表单中。Plone 的默认行为是将这些字段集转换为选项卡(如任何内容项的 编辑 视图中所示)。
您可以禁用此行为
class ReportForm(z3c.form.group.GroupForm, z3c.form.form.Form): # Disable turn fieldsets to tabs behavior enable_form_tabbing = False
卸载保护
Plone 的默认行为是在未提交修改后的表单时添加确认框。
您可以禁用此行为
class SearchForm(z3c.form.group.GroupForm, z3c.form.form.Form): # Disable unload protection behavior enable_unload_protection = False
自动聚焦
Plone 表单的默认行为是使用 formautofocus 模式聚焦“第一个”输入字段。
您可以禁用此行为
class SearchForm(z3c.form.group.GroupForm, z3c.form.form.Form): # Disable autofocus behavior enable_autofocus = False
CSRF保护
影响 Web 表单的常见漏洞之一是跨站请求伪造(CSRF)。这种攻击发生在用户访问第三方网站,而该网站使用 JavaScript 在用户不知情的情况下向您的网站上的 URL 提交请求,利用了用户的活跃会话。
plone.app.z3cform 可以通过在渲染表单时添加一个唯一的令牌作为隐藏输入来防止此类攻击,并在执行表单操作时检查它是否作为请求参数存在。
要启用此保护,请启用表单的 enableCSRFProtection 属性。示例
class PasswordForm(form.Form): """Form to set the user's password.""" enableCSRFProtection = True
覆盖表单主模板
表单由 FormWrapper 视图包围。它将渲染的表单放置在 Plone 页面框架中。默认 FormWrapper 会自动提供,但您可以覆盖它。
以下是带有少量 <select> 输入的占位符示例。
示例 reporter.py
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile as FiveViewPageTemplateFile from zope.i18nmessageid import MessageFactory from zope.schema.vocabulary import SimpleTerm from zope.schema.vocabulary import SimpleVocabulary import plone.app.z3cform import plone.z3cform.templates import z3c.form import zope.interface import zope.schema _ = MessageFactory('your.addon') def make_terms(items): """ Create zope.schema terms for vocab from tuples """ terms = [SimpleTerm(value=pair[0], token=pair[0], title=pair[1]) for pair in items] return terms output_type_vocab = SimpleVocabulary(make_terms([("list", "Patient list"), ("summary", "Summary")])) class IReportSchema(zope.interface.Interface): """ Define reporter form fields """ outputType = zope.schema.Choice( title=u"Output type", description=u"How do you want the output", source=output_type_vocab) country = zope.schema.Choice( title=u"Country", required=False, description=u"Which country to report", vocabulary="allowed_countries") hospital = zope.schema.Choice( title=u"Hospital", required=False, description=u"Which hospital to report", vocabulary="allowed_hospitals") class ReportForm(z3c.form.form.Form): """ A form to output a HTML report from chosen parameters """ fields = z3c.form.field.Fields(IReportSchema) ignoreContext = True output = None @z3c.form.button.buttonAndHandler(_('Make Report'), name='report') def report(self, action): data, errors = self.extractData() if errors: self.status = "Please correct errors" return # Create sample item which we can consume in the page template self.output = dict(country="foobar") self.status = _(u"Report complete") # IF you want to customize form frame you need to make a custom FormWrapper view around it # (default plone.z3cform.layout.FormWrapper is supplied automatically with form.py templates) report_form_frame = plone.z3cform.layout.wrap_form(ReportForm, index=FiveViewPageTemplateFile("templates/reporter.pt"))
示例 configure.zcml
<configure xmlns="http://namespaces.zope.org/zope" xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="your.addon"> <browser:page for="*" name="reporter" class=".reporter.report_form_frame" permission="zope2.View" /> </configure>
示例 templates/reporter.html
<html metal:use-macro="context/main_template/macros/master" i18n:domain="sits.reporttool"> <body> <metal:block fill-slot="main"> <h1 class="documentFirstHeading" tal:content="view/label | nothing" /> <div id="content-core"> <div id="form-input"> <span tal:replace="structure view/contents" /> </div> <div id="form-output" tal:condition="view/form_instance/output"> Chosen country: <b tal:content="view/form_instance/output/country" /> </div> </div> </metal:block> </body> </html>
覆盖小部件框架
您可以按照z3c.form的要求覆盖小部件模板。plone.app.z3cform渲染每个小部件周围的一个框架,通常包含以下内容:
标签
必填标记
描述
您可能想要为您自己的表单自定义这个小部件框架。下面是一个示例。
将widget.pt复制到您自己的包中,并按您希望的任何方式自定义它
在configure.zcml中添加以下内容
<browser:page name="ploneform-render-widget" for=".demo.IDemoWidget" class="plone.app.z3cform.templates.RenderWidget" permission="zope.Public" template="demo-widget.pt" />
在Python代码中创建一个新的标记接口
from zope.interface import Interface class IDemoWidget(Interface): pass
然后将此标记接口应用到您的form.update()中的所有小部件上
from zope.interface import alsoProvides class MyForm(...): ... def update(self): super(MyForm, self).update() for widget in form.widgets.values(): alsoProvides(widget, IDemoWidget)
隐藏没有值的字段
.empty CSS类标记了没有值的字段。如果您不想在查看模式下显示这些字段,请在您的主题中添加以下CSS。
.template-view .empty.field { display: none; }
向小部件添加附加参数
您可以通过plone.autoform.widgets.ParameterizedWidget或通过指令为在此包中定义的小部件添加额外的参数。
from plone.app.z3c.form.widget import DateWidget MyDateWidget = ParameterizedWidget(DateWidget, wrapper_css_class='event_start')
或通过指令
from plone.app.z3c.form.widget import DateWidget @provider(IFormFieldProvider) class IMyEventBehavior(model.Schema): ... widget('event_start', DateWidget, wrapper_css_class='event_start') event_start = schema.TextLine( title=_(u'label_event_start'), description=_(u'help_event_start'), required=True, )
测试
为了测试plone.app.z3form,建议使用plone.app.testing函数测试层,该层将为您设置plone.app.z3cform。请阅读plone.app.z3cform手册以获取更多说明。
如果您仍然需要在单元测试中在较低级别测试表单,您需要手动启用plone.app.z3cform支持。下面是一个示例
import unittest from zope.interface import alsoProvides from zope.publisher.browser import setDefaultSkin from z3c.form.interfaces import IFormLayer class TestFilteringIntegration(unittest.TestCase): """ Test that filtering options work on the form """ layer = MY_TEST_LAYER_WITH_PLONE def setUp(self): super(TestFilteringIntegration, self).setUp() request = self.layer["request"] setDefaultSkin(request) alsoProvides(request, IFormLayer) #suitable for testing z3c.form views def test_report_form_filtering(self): reporter = ReportForm(self.layer["portal"], self.layer["request"]) reporter.update()
故障排除
以下是一些您可能遇到的与plone.app.z3cform相关的常见错误。
updateWidgets()中的ComponentLookupError
Traceback (innermost last): Module ZPublisher.Publish, line 119, in publish Module ZPublisher.mapply, line 88, in mapply Module ZPublisher.Publish, line 42, in call_object Module plone.z3cform.layout, line 64, in __call__ Module plone.z3cform.layout, line 54, in update Module getpaid.expercash.browser.views, line 63, in update Module z3c.form.form, line 208, in update Module z3c.form.form, line 149, in update Module z3c.form.form, line 128, in updateWidgets Module zope.component._api, line 103, in getMultiAdapter ComponentLookupError: ((<getpaid.expercash.browser.views.CheckoutForm object at 0xdb052ac>, <HTTPRequest, URL=https://127.0.0.1:8080/test/@@getpaid-checkout-wizard>, <PloneSite at /test>), <InterfaceClass z3c.form.interfaces.IWidgets>, u'')
plone.app.z3cform层没有就位(配置ZCML没有读取)。您可能忘记将plone.app.z3cform包含在您的产品的configure.zcml配置中。参见上面的安装。
行内验证
首先,让我们设置一些基础设施
>>> from zope.interface import alsoProvides >>> from plone.testing.zope import makeTestRequest >>> from zope.annotation.interfaces import IAttributeAnnotatable >>> from z3c.form.interfaces import IFormLayer>>> app = layer['app'] >>> def make_request(form=None, lang='en'): ... request = makeTestRequest({'HTTP_ACCEPT_LANGUAGE': lang}) ... if form is None: ... form = {} ... request.form.update(form) ... alsoProvides(request, IFormLayer) ... alsoProvides(request, IAttributeAnnotatable) ... return request
然后我们创建一个简单的z3c表单
>>> from zope import interface, schema >>> from z3c.form import form, field, button >>> from plone.z3cform.layout import FormWrapper>>> class MySchema(interface.Interface): ... age = schema.Int(title=u"Age")>>> from __future__ import print_function >>> class MyForm(form.Form): ... fields = field.Fields(MySchema) ... ignoreContext = True # don't use context to get widget data ... ... @button.buttonAndHandler(u'Apply') ... def handleApply(self, action): ... data, errors = self.extractData() ... print(data['age']) # ... or do stuff>>> class MyFormWrapper(FormWrapper): ... form = MyForm ... label = u"Please enter your age">>> from zope.component import provideAdapter >>> from zope.publisher.interfaces.browser import IBrowserRequest >>> from zope.interface import Interface>>> provideAdapter(adapts=(Interface, IBrowserRequest), ... provides=Interface, ... factory=MyFormWrapper, ... name=u"test-form")
让我们验证它是否工作
>>> from zope.component import getMultiAdapter >>> from zope.interface import Interface, implementer >>> from Acquisition import Implicit >>> @implementer(Interface) ... class Bar(Implicit): ... def restrictedTraverse(self, name): ... # fake traversal to the form ... if name.startswith('@@'): ... return getMultiAdapter((self, self._REQUEST), Interface, name[2:]) ... else: ... return getattr(self, name) ... >>> context = Bar() >>> request = make_request() >>> context._REQUEST = request # evil test fake >>> formWrapper = getMultiAdapter((context, request), name=u"test-form") >>> formWrapper <Products.Five...MyFormWrapper object ...> >>> formWrapper.form <class 'plone.app.z3cform.tests.example.MyForm'>>>> del context, request
行内验证
内联验证是通过@@z3cform_validate_field视图调用的。
>>> context = Bar() >>> request = make_request(form={'form.widgets.age': 'Title'}) >>> context._REQUEST = request >>> form = MyForm(context, request) >>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field")
这是与jQuery连接的。当用户离开启用内联验证的表单控件时,它将使用以下参数被调用
>>> z3cform_validate_field(fname=u'form.widgets.age') '{"errmsg": "The entered value is not a valid integer literal."}'>>> request = make_request(form={'form.widgets.age': '20'}) >>> context._REQUEST = request >>> form = MyForm(context, request) >>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field") >>> z3cform_validate_field(fname=u'form.widgets.age') '{"errmsg": ""}'
如果客户端没有提供字段名(fname),则验证应该返回而不会出现任何问题
>>> z3cform_validate_field() '{"errmsg": ""}' >>> z3cform_validate_field(fname=None) '{"errmsg": ""}'
具有组的行内验证
我们使用plone.app.z3cform.tests.example.MyGroupFormWrapper和验证属于一个组的'name'字段。内联验证是通过@@z3cform_validate_field视图调用的。
>>> request = make_request(form={'form.widgets.name': ''}) >>> context._REQUEST = request >>> from plone.app.z3cform.tests.example import MyGroupFormWrapper >>> form = MyGroupFormWrapper(context, request) >>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field")
验证视图接受一个带有数字索引或组名称的fset属性。
>>> z3cform_validate_field(fname=u'form.widgets.name', fset="0") '{"errmsg": "Required input is missing."}' >>> z3cform_validate_field(fname=u'form.widgets.name', fset="mygroup") '{"errmsg": "Required input is missing."}'>>> request = make_request(form={'form.widgets.name': u'Name'}) >>> context._REQUEST = request >>> form = MyGroupFormWrapper(context, request) >>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field") >>> z3cform_validate_field(fname=u'form.widgets.name', fset="0") '{"errmsg": ""}' >>> z3cform_validate_field(fname=u'form.widgets.name', fset="mygroup") '{"errmsg": ""}'
行内验证和错误片段的翻译
我们使用plone.app.z3cform.tests.example.MyGroupFormWrapper和验证属于一个组的'name'字段。内联验证是通过@@z3cform_validate_field视图调用的。
>>> request = make_request(form={'form.widgets.name': ''}, lang='de',) >>> context._REQUEST = request >>> form = MyGroupFormWrapper(context, request) >>> z3cform_validate_field = getMultiAdapter((form, request), name=u"z3cform_validate_field")
验证视图接受一个带有组索引的fieldset属性。只有当显式关闭warning_only时,才会显示错误(与archetypes的行为相匹配)
>>> z3cform_validate_field(fname=u'form.widgets.name', fset="0") '{"errmsg": "Erforderliche Eingabe fehlt."}'
嵌入在普通视图中的表单
可以通过viewlets、portlets或tiles将z3c.form表单嵌入到正常的BrowserView中。
当前,要验证的表单的名称是从URL中获得的。对于嵌入式表单,这无法工作,因为URL中只有包含视图的名称。
直到找到持久解决方案之前,我们只是确保当它接收到作为表单的普通 Browerview 时,验证不会引发异常。
>>> from zope.publisher.browser import BrowserView >>> class MyNormalView(BrowserView): ... """ """>>> provideAdapter(adapts=(Interface, IBrowserRequest), ... provides=Interface, ... factory=MyNormalView, ... name=u"my-view")
让我们验证它是否被调用...
>>> context = Bar() >>> request = make_request() >>> view = getMultiAdapter((context, request), name=u"my-view") >>> view <MyNormalView object ...>
内联验证是通过@@z3cform_validate_field视图调用的。但在这个情况下,不应返回任何验证输出。
>>> context = Bar() >>> request = make_request(form={'form.widgets.age': 'Title'}) >>> z3cform_validate_field = getMultiAdapter((view, request), name=u"z3cform_validate_field") >>> z3cform_validate_field(fname=u'form.widgets.age') '{"errmsg": ""}'
变更日志
4.7.0 (2024-09-24)
新特性
实现新的ContentBrowserWidget以用于pat-contentbrowser模式。
已弃用的RelatedItemsWidget和pat-relateditems模式仍然可用,导入不应中断。但是,z3c.relationfield的默认小部件和转换适配器注册已更改为新小部件。
由于plone.app.relationfield使用plone.autoform架构提示定义小部件,因此直到包更新到新小部件之前,没有任何变化。[petschki] (#197)
4.6.1 (2024-05-30)
内部
日期/时间小部件:修复数据转换适配。通过适配获取日期和datetime小部件的数据转换器,并移除_converter属性黑客。这使代码与z3c.form标准保持一致,并允许覆盖之前难以实现的数据转换器。[thet] (#204)
4.6.0 (2024-04-22)
新特性
如果 checkbox_input 和 radio_input 中有 label_css_class 属性,请使用该属性。[MrTango] (#202)
4.5.0 (2024-03-19)
新特性
为文件输入添加对 "accept" 属性的支持。
如果小部件的字段(如果有)设置了 "accept" 属性(默认情况下,NamedImage 字段设置为 image/*),则这将在文件输入上渲染为 accept 属性。
这将限制上传前允许的文件类型,同时仍然在服务器端进行检查。
修复:https://github.com/plone/plone.formwidget.namedfile/issues/66 依赖:- https://github.com/plone/plone.namedfile/pull/158 - https://github.com/plone/plone.formwidget.namedfile/pull/67 [thet] (#198)
错误修复
修复 SelectFieldWidget 工厂调用。[petschki] (#192)
4.4.1 (2024-02-27)
错误修复
向新的 PatternFormElement 基类添加缺失的 pattern_options 多适配器。[petschki] (#190)
实现缺失的 PasswordWidget 适配器。[petschki] (#193)
4.4.0 (2023-10-18)
新特性
添加 row 容器以启用具有 wrapper_css_class 的字段的列布局。[petschki] (#158)
实现新的 z3c.form 可扩展属性功能,并使用 Chameleon 插值清理小部件模板。[petschki] (#181)
错误修复
为 plone.schema.jsonfield.IJSONField 添加缺失的小部件配置。[petschki] (#185)
4.3.0 (2023-07-14)
新特性
引入新的 Email-Widget,用于 plone.schema.email.IEmail 字段。它使用输入类型 email。[jensens] (#173)
错误修复
修复 OrdereSelectWidget 浏览器验证,当输入为必填时。[petschki] (#178)
当设置 ignoreRequiredOnExtract 时忽略表单验证。[petschki] (#179)
内部
更新配置文件。[plone 开发者] (cfffba8c)
4.2.1 (2023-06-16)
错误修复
为 orderedselect 小部件添加 required。[petschki - 原始 PR 由 szakitibi 提供] (#170)
4.2.0 (2023-05-22)
新特性
将存储实用程序移动到 plone.namedfile 以打破两者之间的依赖循环。[gforcada] (#3764)
错误修复
为 TextareaWidget 移除无效的 Unicode 控制字符。[petschki] (#167)
4.1.0 (2023-04-26)
新特性
合并来自 plone.app.widgets 的实用程序和基类,不再依赖它。[petschki] (#19)
4.0.3 (2023-04-14)
错误修复
修复到 plone.schema 的传递循环依赖。从 plone.schema 中的新中间浏览器层继承自己的 Browserlayer。[jensens] (#163)
添加与 tests extra 相同内容的 test extra。在 Plone 7 中将删除 tests extra。[maurits] (#164)
内部
更新配置文件。[plone 开发者] (3b8337e6)
4.0.2 (2023-03-23)
错误修复
修复链接小部件中的相对 URL 验证。[laulaz] (#160)
内部
更新配置文件。[plone 开发者] (243ca9ec)
4.0.1 (2023-01-26)
错误修复
为 <textarea> 字段添加 required 属性。[frapell] (#156)
4.0.0 (2022-11-30)
错误修复
最终发布。[gforcada] (#600)
4.0.0b1 (2022-08-30)
新特性
将 default_time 属性/参数添加到 Date- 和 DatetimeWidget,允许转换器在没有提供任何内容时设置自定义时间。[jensens] (#151)
可定制的 DateWidget 格式化器长度。[petschki] (#154)
错误修复
允许非默认字段集标签可翻译。[mtrebron] (#87)
修复 statusmessage 的 CSS 类名。[petschki] (#149)
移除 Py 2 的遗留部分(使用 pyupgrade 和手动编辑)。然后运行 black & isort。不再依赖 CMFPlone(循环依赖),而是依赖 plone.base。[jensens] (#150)
允许在 schema.datetime 上使用 DateFieldWidget。见 #151。[jensens] (#151)
移除了 1900 年之前日期的格式化黑客技巧。这已在 Python 3.2 中修复。[jensens] (#152)
4.0.0a10 (2022-05-24)
错误修复
重新启用表单验证。[thet] (#147)
4.0.0a9 (2022-04-04)
新特性
使用与 patternslib 日期选择器一起的浏览器原生日期和 datetime-local 输入。[petschki] (#134)
使用更好的输入类型。[thet] (#134)
从模板中删除 inlinevalidation。[thet] (#134)
实现 TimeWidget,它渲染 <input type="time" />。[petschki] (#134)
在表单中使用 pat-validation。[thet] (#134)
错误修复
现在 time 小部件支持 'name' 和 'value' 属性。[iham] (#134)
将 AddView 注册到正确的浏览器层。[petschki] (#142)
4.0.0a8 (2022-03-23)
新特性
修复了最新 z3c.form 的问题。[petschki] (#146)
4.0.0a7 (2022-03-09)
错误修复
如果 view.form_name 已定义,则将 name 属性添加到表单中。请参阅 easyform 问题 325。 [maurits] (#325)
4.0.0a6 (2022-01-19)
错误修复
重新启用表单描述中的 HTML 渲染。 [petschki] (#138)
4.0.0a5 (2022-01-07)
错误修复
移除小部件包装器类名中的错误额外花括号。 [thet] (#136)
4.0.0a4 (2021-11-26)
新特性
启用多个 wysiwyg 编辑器(使用默认编辑器注册设置)。 [duchenean, gotcha] (#45)
为 Plone 表单启用 formautofocus。允许针对特定表单禁用,使用 enable_autofocus = False。 [jmevissen] (#135)
4.0.0a3 (2021-10-13)
错误修复
修复 BS5 中的表单错误警报(包括不变性错误)。 [jensens] (#129)
修复 Bootstrap 5 的小部件显示模式。 [jensens] (#130)
4.0.0a2 (2021-09-01)
新特性
在处理关系字段时添加对更多小部件选项的支持。 (#125)
4.0.0a1 (2021-04-21)
破坏性更改
为 Plone 6 更新表单小部件实现,使用 Bootstrap 标记 [petschki, balavec, agitator] (#127)
新特性
如果值是 (None,) 且 term_value 无法设置,则添加 ValueError 异常。 [wkbkhard] (#121) (#121)
错误修复
整理 rst 文档标题、间距,并将 .vscode 和 .idea 添加到 gitignore 中。 [balavec] (#0)
3.2.2 (2020-08-21)
错误修复
修复多输入中的重复语法,使其也能在 Zope 4.5 中工作。 [maurits] (#116)
3.2.1 (2020-06-30)
错误修复
修复在添加表单中未翻译的错误消息类型。这解决了 https://github.com/plone/Products.CMFPlone/issues/3126 [vincentfretin] (#115)
3.2.0 (2020-04-20)
新特性
为 RelatedItemsWidget 添加显示模板。不再仅渲染 uuids。 [pbauer] (#111)
3.1.3 (2019-10-12)
错误修复
修复编辑时 LinkWidget 选择的选项卡 #108 [mamico] (#108)
3.1.2 (2019-08-29)
错误修复
修复 pt 中方法属性的错误默认值 [mamico] (#107)
3.1.1 (2019-06-27)
错误修复
修复:关键词损坏 plone/Products.CMFPlone#2885 [jensens] (#105)
3.1.0 (2019-05-01)
新特性
为 AjaxSelectWidget 添加显示模板,显示实际的词汇表术语标题。 [jensens]
IFieldPermissionChecker 已从 plone.app.widgets 移动到这里。 [jensens]
错误修复
修复 AjaxSelectWidget 以尊重与词汇表中的值不同的标记。这包括转换器和小部件本身的更改。还添加了一个测试。现在,小部件也通过 get_ajaxselect_options 从 plone.app.widgets.utils 汇总,以简化整个代码,因此另一个包中的那个现在是死代码,将在那里弃用。 [jensens]
LinkFieldWidget:添加了转换方法 toFieldValue [ksuess]
3.0.9 (2019-01-08)
错误修复
a11y:为 portalMessage 添加了角色属性 [nzambello]
3.0.8 (2018-11-29)
新特性
添加从 zope.schema.interfaces.ITreeVocabulary 层次术语渲染 <optgroup> 元素的支持。 [rpatterson]
3.0.7 (2018-11-07)
错误修复
修复弃用警告(https://github.com/plone/Products.CMFPlone/issues/2605) [ale-rt]
3.0.6 (2018-09-27)
错误修复
为 Python 2/3 兼容性做准备 [pbauer, MatthewWilkes, ale-rt]
3.0.5 (2018-06-19)
错误修复
清理代码分析问题。 [jensens]
修复 SingleCheckBoxBoolWidget 描述以渲染结构 [allusa]
为 Python 2/3 兼容性做准备 [pbauer, MatthewWilkes, ale-rt]
正确渲染 RichTextWidget 的 mime 类型选择框,这也带来了 TinyMCE。 [sallner]
允许在子表单中使用 RelatedItems 小部件 [tomgross]
3.0.4 (2018-02-04)
错误修复
修复来自 https://github.com/plone/plone.app.widgets/pull/177 的测试失败 [thet]
为 Python 2/3 兼容性做准备 [pbauer]
3.0.3 (2017-11-24)
新特性
链接小部件:为外部和电子邮件链接输入字段添加 placeholder 属性。 [thet]
错误修复
修复:向模板添加缺少的 i18n-domains。 [jensens]
在 RichTextWidget 中使用 RichTextValue 的 output_relative_to(self.context) 以便 ITransform 不使用 siteroot。 [jaroel]
修复链接小部件数据转换器中的 toWidgetValue,以便在字段值为空时返回空结构,而不是返回 portal 根对象。修复: https://github.com/plone/Products.CMFPlone/issues/2163 [thet]
将带查询字符串的“内部”链接视为外部链接,否则查询字符串将丢失 [tomgross]
为此包中的小部件允许额外的 CSS 类 [tomgross]
记录小部件的定制 [tomgross]
3.0.2 (2017-09-06)
错误修复
修复了 plone.app.widgets 查询字符串选项变更带来的问题。 [thet]
3.0.1 (2017-07-03)
新特性
添加了新的增强版链接小部件。 [tomgross, thet]
错误修复
修复了在调用非内容上下文(如表单或字段上下文)时的 get_tinymce_options 错误。 [thet]
相关项目小部件:在搜索模式中,如果没有设置 basePath,则在整个站点范围内搜索。修复了:https://github.com/plone/mockup/issues/769 [thet]
修复了 #64:SingleCheckBoxFieldWidget 在查看模式下不渲染值。为了修复此问题,移除了 hacky 视图。它被一个用于渲染布尔值的单个复选框的新小部件所替代。还添加了适当的数据转换器。 [jensens]
3.0 (2017-03-28)
破坏性更改
由于 z3c.form 3.3 移除了底层代码,因此已移除 plone.app.z3cform.object 和 plone.app.z3cform.objectsubform。有关上游更改,请参阅 https://github.com/zopefoundation/z3c.form/pull/38。 [maurits]
新特性
将新类 view-name-VIEWNAME 添加到表单元素中,表示不带旧 kss 前缀的视图名称。新类通过将视图中的 ++ 替换为 - 来替换 ++,以生成有效的类(CSS 可选择)名称。 [jensens]
错误修复
捕获在行内验证中出现的 TypeError,该错误发生在冲突的子请求中 [tomgross]
清理:代码风格、zca-decorators、替换 lambda。 [jensens]
2.2.1 (2017-02-12)
新特性
对于必填的日期或日期时间字段,不要显示“清除”按钮。 [thet]
错误修复
测试修复了 plone.app.widgets 2.1。 [thet]
移除了过时的 __of__ 用于浏览视图 [pbauer]
2.2 (2017-01-02)
破坏性更改
测试修复了 plone.app.widgets 2.1。虽然这不是破坏性变更的功能或 API 方面的变更,但测试只有在 plone.app.widgets 2.1 下才能通过。 [thet]
错误修复
修复了与关系列表一起使用的 RelatedItemsDataConverter,在迭代过程中检查了错误值是否存在。修复了在关系列表中包含 None 值的情况下的失败。 [thet]
修复了与选择列表一起使用的 RelatedItemsDataConverter,其中选择是选中关系 UUID 字符串,但由于选择字段将其值类型设置为 None,因此转换失败 [datakurre]
2.1.2 (2016-12-02)
错误修复
移除了 ZopeTestCase。 [ivanteoh, maurits]
在选择小部件中,接受项目作为属性或方法。这避免了在某些 z3c.form 版本上中断。有关信息,请参阅 https://github.com/zopefoundation/z3c.form/issues/44 [maurits]
2.1.1 (2016-09-16)
错误修复
通过使用模式类 pat-formunloadalert 来启用卸载保护,而不是 enableUnloadProtection。 [thet]
2.1 (2016-08-12)
新特性
当使用 UUID 值的集合时,相关项目数据转换器支持在字段中显式指定的 value_type。这与之前的字段值转换向后兼容,支持 str/unicode 值(无论字段指定哪个)。 [seanupton]
在 pattern_options 字典中支持将函数作为值,然后将其序列化为 JSON。在此之前,递归遍历 pattern_options 并调用所有函数的控件上下文。这允许为特定上下文在运行时评估模式选项值。 [thet]
在渲染模式小部件时不要覆盖小部件默认的 CSS 类。这允许通过 plone.autoform 小部件指令中的 klass 关键字设置 CSS 类。 [thet]
2.0.0 (2016-04-29)
不兼容性
已弃用“plone.app.z3cform.object”并移动到“plone.app.z3cform.objectsubform”,以避免作为模块名称的内置名称,这可能导致难以调试的错误。 [jensens]
通过弃用 zope.deferredimport 明确了 plone.app.z3cform.layout 的现有软弃用(通过注释)。 [jensens]
已移除 plone.app.z3cform.queryselect,因为它已经被弃用,并且移除计划已定(!)用于 Plone 4.1。 [jensens]
新功能
使小部件可用于 wysiwyg_support 模板 [gotcha]
修复
在测试中减少对plone.app.widgets的依赖。[thet]
增强测试以显示RelatedItemsWidget在navigation-roots中的问题。[jensens]
清理:pep8, uth8-headers, zca-decorators, … [jensens]
1.2.0 (2016-02-25)
新功能
为在字段下方插入内容添加金属槽。[fredvd]
修复
修复添加表单的ajax选择。[tomgross]
使用doctest代替zope.testing.doctest。[pbauer]
修复相关项目小部件测试,包括根路径支持。修复TinyMCE小部件选项合并。[alecm]
修复了plone.app.widgets的测试。[Gagaro]
在RelatedItemsWidgetTests.test_widget中使用assertDictEqual代替assertEqual。[Gagaro]
1.1.8 (2016-01-08)
修复
修复了针对新CMFPlone的测试。[Gagaro, ebrehault, vangheem]
1.1.7 (2015-11-26)
修复
当AjaxAutocompleteWidget与选择字段一起使用时,不允许添加新术语。[davisagli]
移除安装plone.app.widgets默认配置文件。在Plone 5中,plone.app.widgets >= 2.0的配置文件仅用于BBB兼容性的占位符。[thet]
1.1.6 (2015-10-27)
修复
检查用户是否可以为AjaxSelectWidget添加关键词。[Gagaro]
1.1.5 (2015-09-20)
不要检查portal_registry中的default_charset,我们只接受utf-8。[esteele]
允许为DatetimeWidget自定义时间选项。[thet]
包装上下文,以便在文本小部件中找到工具。[cguardia]
1.1.4 (2015-09-16)
移除unittest2依赖。[gforcada]
1.1.3 (2015-07-18)
也模拟一些测试中的getToolByName。[vangheem]
1.1.2 (2015-05-11)
从用户那里获取所选编辑器。[vangheem]
1.1.1 (2015-05-04)
使用更具体的browser层IPloneFormLayer进行适配器注册。这避免了双重注册错误。[thet]
1.1.0 (2015-03-21)
集成plone.app.widgets。[vangheem]
1.0.2 (未发布)
修复内联验证警告错误。[jbirdwell]
1.0.1 (2014-10-23)
处理一个错误,当group.__name__为None时,会为字段集赋予id 'fieldset-none',这会导致内联验证出现问题。[esteele]
1.0 (2014-02-26)
移除对collective.z3cform.datetimewidget的依赖,而改用plone.app.widgets。[garbas, thet]
0.7.6 (2014-01-27)
正确翻译字段集标签。[maurits]
可以在表单上添加enable_unload_protection = False以禁用卸载保护。[thomasdesvenain]
为没有值的字段添加'.empty' CSS类。[cedricmessiant]
在从分组表单报告错误时指示'error'状态。[davisagli]
替换已弃用的测试断言语句。[timo]
解决#13567:MultiWidget的InlineValidation损坏。[sunew]
0.7.5 (2013-10-09)
修复了内联验证器的问题,KSS给出了字段集属性值,这些值不能转换为整数。[jpgimenez]
内联验证支持字段集名称,而不是整数索引命名。[seanupton]
使用group __name__,而不是标签值,以便在DOM id和内联验证中使用稳定的字段集_name。[seanupton]
如果客户端请求未传递字段名称,则内联验证的健壮性。[seanupton]
MultiWidget支持IDict,使其与z3c.form 3.0兼容(发布于2013-06-24)[djay]
根据名称为字段集图例提供id,以与Archetypes兼容。[davisagli]
修复了复选框的内联验证。[kroman0]
0.7.4 (2013-08-13)
仅在输入模式下显示'必要' span。[cedricmessiant]
0.7.3 (2013-05-23)
添加了使用z3c.form的ContentProviders的可能性。[gbastien, jfroche, gotcha]
0.7.2 (2013-03-05)
将宏和槽添加到@@ploneform-render-widget模板中,以便可以在不更改周围的标记的情况下覆盖小部件渲染。[davisagli]
恢复了对没有acquisition链的内容的支持。[keul]
0.7.1 (2013-01-01)
覆盖了IObject字段中的ObjectSubForm,以提供get_closest_content方法。现在可以从Multiwidget子表单中猜测最接近的内容。[gborelli]
添加了来自plone.formwidget.contenttree.utils的utils.closest_content。[gborelli]
主要使用表单名称作为'kssattr-formname'表单属性的'form name'。[vipod]
将'fieldset.current'隐藏输入重命名为'fieldset',以与Archetypes保持一致。[davisagli]
0.7.0 (2012-10-16)
支持不依赖于KSS的内联验证。[davisagli]
修复了小部件在表单的内容是字典时崩溃的情况。[davisagli]
0.6.1 (2012-08-30)
修复单个复选框小部件以处理具有 __call__ 方法的部件。[davisagli]
0.6.0 (2012-05-25)
从必填标签中移除硬编码的 ■(框)标记以匹配 sunburst/public.css 和 archetypes 中所做的更改。修复了 Plone 4.2rc1 中的双必填标记。
将表单帮助信息拉入标签标签中,并将其改为 span 而不是 div。目的是通过在标签和帮助信息之间建立语义连接来提高可访问性。与 http://dev.plone.org/ticket/7212 相关
使用 zope.browserpage 中的 ViewPageTemplateFile。[hannosch]
0.5.8 (2012-05-07)
如果已将错误与字段关联,则防止生成空错误 div。[davidjb]
0.5.7 - 2011-11-26
纠正了 FieldWidgets 对象上错误的格式(即来自 invariants)。这关闭了 http://code.google.com/p/dexterity/issues/detail?id=238 [davisagli]
在 widget.pt 中的第一个
添加了 i18n:domain 属性,以便使“必填”工具提示可翻译。修复了 http://dev.plone.org/plone/ticket/12209 [rafaelbco]0.5.6 - 2011-06-30
确保组错误像字段错误一样被格式化。[davisagli]
将组描述和字段描述作为结构包含。[davisagli]
0.5.5 - 2011-06-26
通过设置其 css_class 属性,使能够向表单添加自定义 CSS 类。[davisagli]
匹配 plone.z3cform 的模板,包括表单描述作为结构。[davisagli]
0.5.4 - 2011-05-04
为多和对象小部件定制模板以获得更一致的风格。[elro]
删除对 zope.app.component 的依赖。[davisagli]
添加 MANIFEST.in。[WouterVH]
当找不到术语时(例如,由于安全原因不再可见)引发 LookupError。[lentinj]
0.5.3 - 2011-01-22
修复了 Zope 2.10 中的测试设置。[davisagli]
0.5.2 - 2011-01-18
不要使用基于 collective.testcaselayer 的 IntegrationTestLayer,因为它会导致 Plone 4.1 上的 PicklingError。[elro]
将内联验证更改为与 archetypes 行为相匹配 - 添加警告类并省略错误消息。[elro]
0.5.1 - 2010-11-02
确保 form.extractData() 在表单可用之前(第一次页面加载)调用时不引发 AttributeError。[timo]
此包现在使用 plone i18n 域。[vincentfretin]
添加了覆盖 <form action=""> 的选项。[miohtama]
更新了关于表单操作和方法的 README。[miohtama]
0.5.0 - 2010-04-20
渲染组表单小部件管理器验证器中的错误。修复了 http://code.google.com/p/dexterity/issues/detail?id=96 [davisagli]
默认显示默认字段集,而不是第一个非默认字段集。[davisagli]
将必填字段指示器图像替换为 Unicode 框,参照 http://dev.plone.org/plone/ticket/10352 [davisagli, limi]
用标准单选复选框 Plone 版本替换了现有的基于单选按钮的布尔值小部件。[limi]
添加 @@ploneform-render-widget 视图,以便可以针对特定的小部件类型定制小部件外观。[davisagli]
在 titlelessform 宏中添加了插槽。有关详细信息,请参阅 plone.z3cform 中的 README.txt。[optilude, davisagli]
清理了模板以符合 Plone 4 规范。[optilude]
使模板和内联验证与 plone.z3cform 0.6 及更高版本的独立表单兼容。[optilude]
使用此包的扩展配置文件安装浏览器层 IPloneFormLayer。它从 z3c.form 的 IFormLayer 继承,允许默认小部件正常工作。在使用 z3c.form 表单之前,您应该在 portal_quickinstaller 中安装此包。[optilude]
对于具有文本/ascii 行值类型的序列类型,将 textlines 小部件设置为默认值。z3c.form 的默认小部件太容易混淆了。[optilude]
使用表单类中定义的表单方法。这允许使用 HTTP GET 表单。在模板中,方法之前是硬编码为“post”。[miohtama]
0.4.9 - 2010-01-08
删除当前用户WYSIWYG编辑器偏好的查找(在Plone 4上已损坏)。wysiwyg_support模板为我们完成了这项工作。[davisagli]
0.4.8 - 2009-10-23
让KSS验证器使用publish traversal而不是OFS traversal来查找表单。这使得它可以使用由自定义IPublishTraverse适配器访问的表单。[davisagli]
添加了enable_form_tabbing选项,以防止将字段集转换为标签页。[vincentfretin]
给生成的表单添加了id。[vincentfretin]
修复了macros.pt中的问题:fieldset.current隐藏输入从未生成。[vincentfretin]
0.4.7 - 2009-09-25
在macros.pt中为“Info”和“Error”消息设置plone i18n域,以便进行翻译。[vincentfretin]
0.4.6 - 2009-07-26
从我们的overrides.zcml中包含plone.z3cform的overrides.zcml。[optilude]
更新到collective.z3cform.datetimewidget>=0.1a2,以解决与z3c.form的ZCML冲突。[davisagli]
0.4.5 - 2009-05-25
使KSS表单支持取决于已安装的kss.core和Archetypes。[hannosch]
将collective.z3cform.datetimewidget中的日期/时间小部件用作日期和日期时间字段的默认小部件。[davisagli]
0.4.4 - 2009-05-03
使KSS验证器使用traversal而不是getMultiAdapter()来查找表单。这使得它在添加表单上也能工作。参见http://code.google.com/p/dexterity/issues/detail?id=27 [optilude]
0.4.3 - 2009-04-17
为WYSIWYG小部件添加了显示模板。[optilude]
使?fieldset.current查询字符串变量工作。将其设置为除默认字段集外的字段集id,以便预选择不同的字段集,例如…/@@formview?fieldset.current=3 [optilude]
如果没有内容显示,则隐藏“默认”字段集。[optilude]
在wysiwyg模板中提供“portal”变量,因为一些编辑器会使用它。[davisagli]
0.4.2 - 2008-09-04
使WYSIWYG小部件也能用于非Acquisition包装的内容。
0.4.1 - 2008-08-21
删除了对zope.component的最大版本依赖。这应该留给索引、已知良好的集合或在buildouts中的显式版本要求。如果您使用zope.component >= 3.5,则需要five.lsm >= 0.4。[hannosch]
利用plone.z3cform的新支持,通过适配器查找布局模板。这意味着现在表单不再需要依赖于plone.app.z3cform,除非它们想要使用Plone特定的小部件。
0.4.0 - 2008-07-31
使用KSS添加内联验证支持。
要求zope.component <= 3.4.0以防止与five.localsitemanager的兼容性问题,其中存在一个有缺陷的版本(0.3)被plone.recipe.plone 3.1.4锁定。如果您遇到这种情况,请升级到该版本:
... Module five.localsitemanager.registry, line 176, in registeredUtilities ValueError: too many values to unpack
0.3.2 - 2008-07-25
修复了macros.pt中的错误,其中fieldset的‘has_groups’和‘show_default_label’在‘form’宏中设置,使‘field’宏无法单独使用。
0.3.1 - 2008-07-24
修复了错误,我们使用的是plone.z3cform中定义的表单宏,而不是我们自己的宏。
0.3 - 2008-07-24
从plone.z3cform中提取的Plone特定部分创建此包。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
plone_app_z3cform-4.7.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7fdb617efc46ba862dbcef601dae5192c652c09b12ec82d64bab2c738fb1922e |
|
MD5 | 69a673d305ad6bba5d3b928277dd6cfd |
|
BLAKE2b-256 | 0b7d803306d83d7778a9ab1528b221445ccb89e2ebfdfb2fe03bd853f9366b5b |
plone.app.z3cform-4.7.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 82eb060683ac0f6d252739b0143489ed91e4a8d93b82f391c703d9ccd2e8cf4c |
|
MD5 | af044f4ccba22917f1162c00d5992a17 |
|
BLAKE2b-256 | 3cd66dfc0d485bbc15de0c23206a133f940b6315473bccd4be91355ec3fa1a13 |