Question

J'ai installé la dernière branche SVN de Django qui inclut les nouveaux formulaires. J'essaie d'utiliser le SelectDateWidget de django.forms.extras.widgets mais le champ apparaît en tant que widget DateInput normal.

Voici le formulaire.py de mon 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

Qu'est-ce que je fais mal? Vérification du formulaire / extras / widgets.py La classe SelectDateWidget existe.

Était-ce utile?

La solution

Le vrai problème était que SelectDateWidget ne pouvait pas être référencé de cette façon. Changer le code pour le référencer différemment a résolu mon problème:

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

Cela semble être une limitation à laquelle vous ne pouvez pas faire référence à package.package.Class à partir d'un package importé. La solution importe les extras et la référence n’est que package.Class.

Autres conseils

À partir du ticket concernant le manque de documentation pour SelectDateWidget ici: Ticket n ° 7437

Il semble que vous deviez l'utiliser comme ceci:

widget=forms.extras.widgets.SelectDateWidget()

Notez que les parenthèses sont l'exemple.

Pourquoi ne pas utiliser forms.SelectDateWidget . Utilisez-le simplement comme référence.

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))

Voici le formulaire.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))

Votre code fonctionne bien pour moi tel que rédigé. Dans un cas comme celui-ci, recherchez les disparités entre le nom du champ dans le modèle et le formulaire ( DOB par rapport à dob est une faute de frappe facile à faire), et que vous ' Vous avez instancié le bon formulaire dans votre vue et l'avez transféré au modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top