3

我正在使用 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"

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

4

3 回答 3

1

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

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

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

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

于 2011-04-25T11:07:15.140 回答
0

这可能有助于将自定义日期小部件添加到您的 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() 

hooks 很简单……看看现有的代码。

于 2011-04-25T09:25:29.737 回答
0

这就是我所做的:

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
于 2011-04-26T19:32:55.800 回答