#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://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