Campo de formulario de Django usando SelectDateWidget
Pregunta
He instalado la última rama SVN de Django que incluye los nuevos formularios. Estoy tratando de usar el widget SelectDateWidget de django.forms.extras.widgets pero el campo se muestra como un widget DateInput normal.
Aquí está el forms.py de mi aplicación:
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
¿Qué estoy haciendo mal? Comprobando los formularios / extras / widgets.py veo que existe la clase SelectDateWidget.
Solución
El verdadero problema era que SelectDateWidget no puede ser referenciado de esta manera. Cambiar el código para hacer referencia de manera diferente resolvió mi problema:
from django.forms import extras
...
DOB = forms.DateField(widget=extras.SelectDateWidget)
Esto parece ser una limitación a la que no puede hacer referencia package.package.Class desde un paquete importado. La solución importa extras, por lo que la referencia es solo package.Class.
Otros consejos
Del boleto re: la falta de documentación para SelectDateWidget aquí: Ticket # 7437
Parece que necesitas usarlo así:
widget=forms.extras.widgets.SelectDateWidget()
Tenga en cuenta que el paréntesis es el ejemplo.
¿Por qué no usar formularios .SelectDateWidget
? Solo úsalo como referencia.
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))
Aquí está el 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))
Su código funciona bien para mí como está escrito. En un caso como este, verifique que no haya coincidencias entre el nombre del campo en el modelo y el formulario ( DOB
versus dob
es un error tipográfico fácil de hacer), y que usted ' instanciamos el formulario correcto en su vista y lo pasamos a la plantilla.