Pergunta

Eu tenho instalado o mais recente branch SVN do Django que inclui as novas formas. Eu estou tentando usar o SelectDateWidget de django.forms.extras.widgets mas o campo está aparecendo como um widget DateInput normal.

Aqui está a forms.py do meu aplicativo:

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

O que estou fazendo de errado? Verificando os formulários / extras / widgets.py vejo existe a classe SelectDateWidget.

Foi útil?

Solução

O verdadeiro problema foi que SelectDateWidget não pode ser referenciado desta forma. Alterar o código para referenciá-lo de forma diferente resolveu o meu problema:

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

Esta parece ser uma limitação que você não pode fazer referência package.package.Class de um pacote importado. As importações de soluções extras assim que a referência é apenas package.Class.

Outras dicas

Desde o bilhete re: a falta de documentação para SelectDateWidget aqui: Ticket # 7437

Parece que você precisa usá-lo como este:

widget=forms.extras.widgets.SelectDateWidget()

Observe os parênteses é o exemplo.

Por que não usar forms.SelectDateWidget. Basta usá-lo como referência.

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

Aqui está a 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))

Seu código fina funciona para mim como está escrito. Em um caso como este, verificar se há discrepâncias entre o nome do campo no modelo e forma (DOB contra dob é um erro de digitação fácil de fazer), e que você tenha instanciado a forma correta na sua opinião, e passou para a template.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top