2009-05-01 16 views
6

He instalado la última rama de SVN de Django que incluye los nuevos formularios. Intento usar SelectDateWidget de django.forms.extras.widgets, pero el campo se muestra como un widget de entrada de fecha normal.campo de formulario Django usando SelectDateWidget

Aquí es 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.

Respuesta

10

El problema real es que SelectDateWidget no se puede hacer referencia de esta manera. Cambiar el código para hacer referencia a los que resuelve mi problema diferente:

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

Esto parece ser una limitación que no puede hacer referencia package.package.Class de un paquete importado. La solución importa extras por lo que la referencia es solo package.Class.

4

De las entradas re: la falta de documentación para SelectDateWidget aquí: Ticket #7437

Parece que hay que usarla como esto:

widget=forms.extras.widgets.SelectDateWidget() 

Nota de los paréntesis es el ejemplo.

+1

Buena sugerencia, pero en realidad no es necesario crear una instancia de la clase Widget cuando se pasa como el atributo, a menos que tenga los parámetros de configuración específicos que desea que el constructor de widget de tener. El marco de trabajo de django en realidad comprueba si el widget es una clase o una instancia, y lo instanciará por usted si es necesario. –

+0

Lamentablemente, esto no funcionó, Jarret tiene razón. – timbonicus

0

Tu código funciona bien para mí tal como está escrito. En un caso como este, compruebe si hay desajustes entre el nombre del campo en el modelo y el formulario (DOB frente a dob es un error fácil de realizar), y que ha instanciado el formulario correcto en su vista, y lo pasó al modelo.

+0

Instanciar el formulario con una vista resolvió el problema, o al menos me llevó a otros problemas más emocionantes. :) Tuve un malentendido sobre cómo funcionó esto. – timbonicus

1

Aquí es 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)) 
Cuestiones relacionadas