Укажите формат даты и времени в zope.schema.Дата на Plone

#plone #zope #zope.interface

#plone #zope #zope.interface

Вопрос:

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

из zope.schema импортируйте выбор, Float, Int, Date, TextLine 
из Products.Five.formlib.formbase импортируйте форму страницы

класс - это Simuladorform(интерфейс):
 """
 Интерфейс Zope для финансового симулятора для sofomanec.
 """ 
 start_date = Дата(title=_(u'Start Date'), 
 описание=_(дата начала загрузки.'), 
 обязательно = False)
.
.
.

класс SimuladorForm(форма страницы):
 form_fields = форма.formFields(ISimuladorForm)

По умолчанию для ввода start_date используется формат «мм / дд / гг», но пользователям необходимо вводить start_date в этом формате: «дд / мм / гг».

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

Ответ №1:

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

Для этого требуется displayStyle атрибут, который управляет форматированием значения, и он будет использовать язык запроса для форматирования даты. displayStyle должно быть одним из ‘full’, ‘long’, ‘medium’, ‘short’ или None и относится к форматам даты, определенным в zope.i18n ; по умолчанию используется None, что, я думаю, означает ‘short’, но из кода это неясно.

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

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

Комментарии:

1. Спасибо, после некоторой борьбы с 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=113031amp;view=markup

Пользовательское преобразование формата даты с использованием

 _toFieldValue()
_fromFieldValue() 
  

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

Комментарии:

1. Этот комментарий также мне очень помог.

Ответ №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