Plone / zope.schema-如何在两个日期之间的日期窗口小部件上设置年份范围?

时间:2016-06-14 13:41:04

标签: plone zope

在我的表单(plone.directives.form.SchemaForm)中,我使用的是包含日期字段(zope.schema.Date)的模式,并且datefield被自动设置为datepicker小部件。

编辑:我使用的是Plone 4.3.9

小部件的默认年份范围自动设置为相对于日期的-10年和+ 10年。

我尝试为日期字段制作小工具工厂并设置年份范围

from z3c.form.widget import FieldWidget
from zope.component import adapter
from zope.interface import implementer
from plone.directives import form
from datetime import date
from plone.formwidget.datetime.z3cform import DateWidget
from plone.supermodel import model
from z3c.form.interfaces import IFieldWidget

@implementer(IFieldWidget)
def DateFieldWidget(field, request):
    widget = FieldWidget(field, DateWidget(request))
    start = -(date.today().year - 1984)
    end = 10
    widget.years_range = (start, end)
    return widget

class IMyObject(model.Schema):
    ...
    form.widget('Prev_Date',DateFieldWidget)
    Prev_Date = schema.Date(
        title=u"Previous Date",
        description=u"A previous date",
        required=False,
    )

这仅适用于添加形式,其中它设置在一年之间,在我提供的1984年的例子和从今天的年份开始的10年。在编辑表单中,可供选择的第一年和最后几年都已关闭。

我确实尝试检查是否可以查看该值是否已设置,但在编辑表单中,即使已设置了空值,我也会获得空值。

@implementer(IFieldWidget)
def DateFieldWidget(field, request)
    widget = FieldWidget(field, DateWidget(request))
    #widget.value is a tuple
    defaultEndOfRange = 10
    try:
        start = -(int(widget.value[0]) - 1984)
        end = defaultEndOfRange - (int(widget.value[0]) - date.today().year)
    except:
        start = -(date.today().year - 1984)
        end = defaultEndOfRange
    widget.years_range = (start,end)
    return widget

我可以在updateWidgets函数中执行此操作,而不是使用小部件工厂,但我有两个灵巧内容类型,我没有自定义添加和编辑表单,我想在几个不同的年份使用相同的年份范围字段。

由于这不起作用,什么是更好的方法?或者我应该坚持创建添加和编辑表单?

1 个答案:

答案 0 :(得分:1)

在我的表格界面中我有一个日期字段的定义:

from collective.z3cform.datetimewidget import DateWidget    
....
....
....    
form.widget('birthday', DateWidget)
birthday = schema.Date(
  title=_(u'Birthday'),
  description=_(u'your birthday'),
  required=True,
  min = date(1950,1,1),
  max = date(2015,1,1))

但它是Plone 4解决方案。