Just wanted to thank Neil and Roger for the pointers on the DateWidget examples. Also, incase anyone else runs into the same issue, here is the merged version I ended up with. Thanks again! class DateWidget (CompositeWidget): def __init__ (self, name, value=None, yoptions=None, moptions=None, doptions=None, **kwargs): this_year = now().tuple()[0] if not yoptions: yoptions = [ (y, y) for y in range(this_year, this_year-80, -1) ] yoptions.insert(0, ('','')) self.yoptions = yoptions if not moptions: moptions = [ (m, m) for m in range(1, 13) ] moptions.insert(0, ('','')) self.moptions = moptions if not doptions: doptions = [ (d, d) for d in range(1, 32) ] doptions.insert(0, ('','')) self.doptions = doptions year = '' month = '' day = '' if value: #process sent value to date pass CompositeWidget.__init__(self, name, value, **kwargs) self.add(SingleSelectWidget, 'month', value=month, options=self.moptions, required=True) self.add(SingleSelectWidget, 'day', value=year, options=self.doptions, required=True) self.add(SingleSelectWidget, 'year', value=year, options=self.yoptions, required=True) def _parse(self, request): CompositeWidget._parse(self, request) if self.get_error(): return year = self['year'] month = self['month'] day = self['day'] if (not self.yoptions.index((year,year)) or not self.moptions.index((month,month)) or not self.doptions.index((day,day)) ): self.error = "bad date value" try: self.value = DateTime(year,month,day) except RangeError: self.error = "date specified does not exist" def render(self): return (self.get_widget('month').render() + self.get_widget('day').render() + self.get_widget('year').render() )