Укажите формат DateTime на zope.schema. Дата на Plone - PullRequest
3 голосов
/ 25 апреля 2011

Я работаю над формой с Formlib, которая выглядит следующим образом:

from zope.schema import Choice, Float, Int, Date, TextLine
from Products.Five.formlib.formbase import PageForm

class ISimuladorForm(Interface):
    """
    Zope Interface for the financial simulator for sofomanec.
    """
    start_date      = Date(title=_(u'Start Date'),
                            description=_(u'Loan start date.'),
                            required=False)
.
.
.

class SimuladorForm(PageForm):
    form_fields = form.FormFields(ISimuladorForm)

Формат ввода по умолчанию для start_date - "мм / дд / гг" , но пользователям необходимо ввести start_date в следующем формате: "дд / мм / гг" .

Как изменить формат даты по умолчанию для этого интерфейса / схемы / формы?

Ответы [ 3 ]

1 голос
/ 25 апреля 2011

Вы можете использовать DateI18nWidget вместо значения по умолчанию DateWidget.

Требуется атрибут displayStyle, который управляет форматированием значения, и он будет использовать языковой стандарт запроса для форматирования даты. displayStyle должно иметь одно из значений: «полный», «длинный», «средний», «короткий» или «Нет» и относится к форматам даты, определенным в zope.i18n; по умолчанию None, что, я думаю, означает «короткий», но это неясно из кода.

Точное форматирование берется из языкового стандарта запроса, который, в свою очередь, основан на языке, установленном для сайта Plone инструментом portal_languages. Таким образом, настройка языка сайта также определяет, какие форматы даты будет использовать DateI18nWidget; они определены в пакете zope.i18n в каталоге locales/data, в наборе файлов XML (ищите элемент <dateFormats>).

Если это неудовлетворительно, вам придется создать собственный виджет браузера. Лучше всего подклассифицировать DateWidget самостоятельно и предоставить новый метод _toFormValue для форматирования желаемых дат.

0 голосов
/ 26 апреля 2011

Вот что я сделал:

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
0 голосов
/ 25 апреля 2011

Это может быть полезно для добавления настраиваемого виджета даты в форму 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() 

довольно легко ... посмотрите на существующий код.

...