2

How can I set selectDateWidget day and month options to default as 1st January but leave the year option intact.

Now I am doing:

day = datetime.date.today()
lessTime = forms.DateField(required=False, widget=SelectDateWidget(years=range(1980, 2013)), initial=day)

But this sets the default to the actual date. What can I change to give me the desired default options?

Thanks in advance

Santiago
  • 1,984
  • 4
  • 19
  • 24

1 Answers1

1

Make a custom widget e.g MySelectDateWidget

class MySelectDateWidget(SelectDateWidget):
    def render(self, name, value, attrs=None):
        from collections import namedtuple
        date_tweak = namedtuple('Date', 'year month day')
        date_value = date_tweak(None, 1, 1) #tweak to cheat SelectDateWidget's 
                                   #render method which expects a datetime object
        return super(MySelectDateWidget, self).render(name, date_value, attrs)

and then replace:

lessTime = forms.DateField(required=False,    
          widget=SelectDateWidget(years=range(1980, 2013)), initial=day)

with:

lessTime = forms.DateField(required=False,          
                           widget=MySelectDateWidget(years=range(1980, 2013)))
thikonom
  • 4,219
  • 3
  • 26
  • 30
  • This works great in setting the default options but now my Django form says it isn't valid after submission. form = ContactForm(request.POST) form.is_vaild() >>> form == False What can I change to make this work? – Santiago Sep 23 '12 at 16:20
  • 2020: if you are using Django 3 (or perhaps a later version of 2) the `render` methods in `MySelectDateWidget/1` should both be `renderer`. – tfantina Apr 16 '20 at 19:23