Django表单字段使用SelectDateWidget

6

我已经安装了Django的最新SVN分支,其中包括了新的表单。我正在尝试使用来自django.forms.extras.widgets的SelectDateWidget,但该字段显示为普通的DateInput小部件。

这是我的应用程序中的forms.py:

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

我做错了什么?查看表单/额外/小部件.py文件,我发现SelectDateWidget类已经存在。
5个回答

11

实际问题是不能用这种方式引用SelectDateWidget。将代码更改为以不同的方式引用它解决了我的问题:

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

这似乎是一个限制,即无法从已导入的包中引用package.package.Class。解决方案是导入extras,这样引用就变成了package.Class。


4

关于SelectDateWidget缺乏文档的问题,请参考以下链接:

Ticket #7437

使用方法如下:

widget=forms.extras.widgets.SelectDateWidget()

请注意,括号是一个例子。

1
不错的建议,但是当你将Widget类作为属性传递时,实际上并不需要对它进行实例化,除非你有特定的配置参数想要传递给widget的构造函数。Django表单框架会检查widget是一个类还是一个实例,并在必要时帮你实例化它。 - Jarret Hardie

2
为什么不使用forms.SelectDateWidget。只需将其用作参考即可。
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))

2

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

0

你的代码按原样可正常工作。在这种情况下,请检查模型和表单字段名称之间的不匹配(DOBdob之间的差异是一个容易犯的笔误),以及您在视图中实例化了正确的表单,并将其传递给模板。


通过使用视图实例化表单解决了问题,或者至少让我遇到了其他更有趣的问题。 :) 我对它是如何工作产生了误解。 - timbonicus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接