【问题标题】:Django form field using SelectDateWidget使用 SelectDateWidget 的 Django 表单字段
【发布时间】:2010-10-23 01:22:59
【问题描述】:

我已经从 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

我做错了什么?检查 forms/extras/widgets.py 我看到 SelectDateWidget 类存在。

【问题讨论】:

    标签: python django forms widget admin


    【解决方案1】:

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

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

    这似乎是一个限制,您不能从导入的包中引用 package.package.Class。该解决方案导入 extras,因此引用只是 package.Class。

    【讨论】:

      【解决方案2】:

      来自票证:此处缺少 SelectDateWidget 的文档: Ticket #7437

      看来你需要这样使用它:

      widget=forms.extras.widgets.SelectDateWidget()
      

      注意括号是例子。

      【讨论】:

      • 好建议,但是当您将 Widget 类作为属性传递时,您实际上不需要实例化它,除非您希望该小部件的构造函数具有特定的配置参数。 django Form 框架实际上会检查小部件是类还是实例,并在必要时为您实例化它。
      【解决方案3】:

      为什么不使用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))
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您的代码对我来说工作正常。在这种情况下,检查模型中的字段名称和表单之间的不匹配(DOBdob 是一个容易犯的错字),并且您已经在视图中实例化了正确的表单,并且将其传递给模板。

          【讨论】:

          • 用视图实例化表单解决了这个问题,或者至少让我遇到了其他更令人兴奋的问题。 :) 我误解了它是如何工作的。
          猜你喜欢
          • 2012-06-08
          • 2014-07-16
          • 2014-07-19
          • 1970-01-01
          • 1970-01-01
          • 2013-12-03
          • 2016-12-20
          • 2019-04-26
          • 2015-04-14
          相关资源
          最近更新 更多