Django form field using SelectDateWidget
Asked Answered
C

5

6

I've installed the latest SVN branch from Django which includes the new forms. I'm trying to use the SelectDateWidget from django.forms.extras.widgets but the field is showing up as a normal DateInput widget.

Here is the forms.py from my application:

from django import forms
from jacob_forms.models import Client

class ClientForm(forms.ModelForm):
    DOB = forms.DateField(widget=forms.extras.widgets.SelectDateWidget)

    class Meta:
            model = Client

What am I doing wrong? Checking the forms/extras/widgets.py I see the SelectDateWidget class exists.

Cider answered 1/5, 2009 at 5:36 Comment(0)
C
11

The real problem was that SelectDateWidget can't be referenced this way. Changing the code to reference it differently solved my problem:

from django.forms import extras
...
    DOB = forms.DateField(widget=extras.SelectDateWidget)

This seems to be a limitation that you can't reference package.package.Class from an imported package. The solution imports extras so the reference is just package.Class.

Cider answered 1/5, 2009 at 18:12 Comment(0)
B
4

From the ticket re: the lack of documentation for SelectDateWidget here: Ticket #7437

It looks like you need to use it like this:

widget=forms.extras.widgets.SelectDateWidget()

Note the parentheses is the example.

Barbur answered 1/5, 2009 at 5:45 Comment(1)
Good suggestion, but you actually don't need to instantiate the Widget class when you pass it as the attribute, unless you have specific configuration parameters you want that widget's constructor to have. The django Form framework actually checks to see if the widget is a class or an instance, and will instantiate it for you if necessary.Berner
M
2

Here is the form.py

from django import forms
from django.forms import extras

DOY = ('1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987',
       '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995',
       '1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003',
       '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011',
       '2012', '2013', '2014', '2015')


DOB = forms.DateField(widget=extras.SelectDateWidget(years = DOY))
Minaret answered 4/2, 2015 at 15:39 Comment(0)
G
2

Why not use forms.SelectDateWidget. Just use it as reference.

import datetime

from django import forms


class HistDateForm(forms.Form):
    cur_year = datetime.datetime.today().year
    year_range = tuple([i for i in range(cur_year - 2, cur_year + 2)])
    hist_date = forms.DateField(initial=datetime.date.today() - datetime.timedelta(days=7),widget=forms.SelectDateWidget(years=year_range))
Gynophore answered 1/5, 2018 at 7:40 Comment(0)
B
0

Your code works fine for me as written. In a case like this, check for mismatches between the name of the field in the model and form (DOB versus dob is an easy typo to make), and that you've instantiated the right form in your view, and passed it to the template.

Berner answered 1/5, 2009 at 12:40 Comment(1)
Instantiating the form with a view solved the problem, or at least led me to other, more exciting problems. :) I had a misunderstand of how this worked.Cider

© 2022 - 2024 — McMap. All rights reserved.