【问题标题】:Specify DateTime format on zope.schema.Date on Plone在 zope.schema.Date 上指定 DateTime 格式
【发布时间】:2011-08-12 04:49:08
【问题描述】:

我正在使用 Formlib 制作一个如下所示的表单:

从 zope.schema 导入选择、浮点、整数、日期、文本行 从 Products.Five.formlib.formbase 导入 PageForm ISimuladorForm 类(接口): """ 用于 sofomanec 财务模拟器的 Zope 界面。 """ start_date = Date(title=_(u'开始日期'), description=_(u'贷款开始日期。'), 必需=假) . . . SimuladorForm 类(PageForm): form_fields = form.FormFields(ISimuladorForm)

start_date的默认输入格式是"mm/dd/yy",但是用户需要输入start_date这种格式:"dd/mm/yy"

如何更改此接口/架构/表单的默认日期格式?

【问题讨论】:

    标签: plone zope zope.interface


    【解决方案1】:

    您可以使用DateI18nWidget 代替默认的DateWidget

    它需要一个displayStyle 属性来控制值的格式,并且它将使用请求区域设置来格式化日期。 displayStyle 必须是 'full'、'long'、'medium'、'short' 或 None 之一,并且指的是zope.i18n 中定义的日期格式;默认值为无,我认为这意味着“短”,但这在代码中并不清楚。

    确切的格式取自请求区域设置,而请求区域设置又基于 portal_languages 工具为 Plone 站点设置的语言。因此,设置网站的语言也决定了DateI18nWidget 将使用的日期格式;这些在locales/data 目录下的zope.i18n 包中定义,在一组XML 文件中(查找<dateFormats> 元素)。

    如果这不令人满意,那么您将不得不创建一个自定义浏览器小部件。最好的办法是自己继承 DateWidget 并提供一个新的 _toFormValue 方法来按照您想要的方式格式化日期。

    【讨论】:

    • 谢谢,在与displayStyle 苦苦挣扎之后,我终于做到了。
    【解决方案2】:

    这可能有助于将自定义日期小部件添加到您的 formlib 表单:

    http://plone.org/documentation/manual/developer-manual/forms/using-zope.formlib/customizing-the-template-and-the-widgets

    我建议通过从现有的一个派生来编写自己的日期小部件 日期小部件类:

    http://svn.zope.org/zope.formlib/trunk/src/zope/formlib/textwidgets.py?rev=113031&view=markup

    使用日期格式的自定义转换

    _toFieldValue()
    _fromFieldValue() 
    

    钩子很简单……看看现有的代码。

    【讨论】:

    • 这条评论对我也很有帮助。
    【解决方案3】:

    这就是我所做的:

    from zope.app.form.browser import DateI18nWidget
    from zope.i18n.format import DateTimeParseError
    from zope.app.form.interfaces import ConversionError
    
    
    class MyDateI18nWidget(DateI18nWidget):
        displayStyle = None
    
        def _toFieldValue(self, input):
            if input == self._missing:
                return self.context.missing_value
            else:
                try:
                    formatter = self.request.locale.dates.getFormatter(
                        self._category, (self.displayStyle or None))
                    return formatter.parse(input.lower())
                except (DateTimeParseError, ValueError), v:
                    raise ConversionError(_("Invalid datetime data"),
                        "%s (%r)" % (v, input))
    
    class SimuladorForm(PageForm):
    ...
        form_fields['start_date'].custom_widget = MyDateI18nWidget
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多