Python 在Django上所需的selectDateWidget上显示空的\u标签

Python 在Django上所需的selectDateWidget上显示空的\u标签,python,django,python-2.7,django-models,django-forms,Python,Django,Python 2.7,Django Models,Django Forms,根据Django在SelectDateWidget()上的文档,如果不需要日期字段,将显示空标签。我注意到,如果需要日期字段,小部件上的默认值将是一月、1和。是否有办法使日期字段成为必需的,但在初始表单上显示带有空标签的小部件(如------)?不幸的是,SelectDateWidget中的空标签仅在不需要字段的情况下使用,但您可以通过子类化SelectDateWidget并重写create\u select方法来改变这一点: class MySelectDateWidget(SelectDat

根据Django在SelectDateWidget()上的文档,如果不需要
日期字段
,将显示
空标签
。我注意到,如果需要
日期字段
,小部件上的默认值将是
一月
1
。是否有办法使
日期字段成为必需的,但在初始表单上显示带有
空标签的小部件(如------)?

不幸的是,
SelectDateWidget
中的空标签仅在不需要字段的情况下使用,但您可以通过子类化
SelectDateWidget
并重写
create\u select
方法来改变这一点:

class MySelectDateWidget(SelectDateWidget):

    def create_select(self, *args, **kwargs):
        old_state = self.is_required
        self.is_required = False
        result = super(MySelectDateWidget, self).create_select(*args, **kwargs)
        self.is_required = old_state
        return result

但在这种情况下,您可能还必须覆盖字段的验证,因此它将抛出一个错误,该字段是必需的,而不是当select保留为空值时,该选项无效。

查看SelectDateWidget的代码,没有很好的方法可以做到这一点(django 2.1.4)。 我的解决方案是在客户端添加空选项(使用jquery):

$(文档).ready(函数(){
$('#select widget id select')。每个(函数(){
如果(!$(此).children('[value=”“],[selected]').length){
$(this.prepend('--');
}
});
});

虽然在Django的最新版本中删除了
创建_选择
,但我能够使用一种非常类似于@GwynBleidD的方法,将SelectDateWidget子类化并覆盖get_上下文

class MySelectDateWidget(SelectDateWidget):

    def get_context(self, name, value, attrs):
        old_state = self.is_required
        self.is_required = False
        context = super(MySelectDateWidget, self).get_context(name, value, attrs)
        self.is_required = old_state
        return context

另一种解决方法是将表单字段设置为可选(required=False),并实施自定义验证以确保该字段包含以下内容:

from django import forms

class MyForm(forms.ModelForm):

    myfield = forms.DateField(widget=forms.SelectDateWidget(empty_label=(u'year', u'month', u'day')),
                              required=False)

    def clean_myfield(self):
        value = self.cleaned_data['myfield']
        if not value:
            raise forms.ValidationError(u'Please fill out myfield')
        return value

棒 极 了当所有3个字段都为空时引发的错误是“此字段是必需的”,当1个或多个字段为空时引发的错误是“输入有效日期”。我觉得那太好了。谢谢。我假设验证还没有准备好,但看起来是这样。在django 1.11中(可能在早期版本中也是如此),这将不再有效。SelectDateWidget似乎已被重写。create_select函数不再使用。我可以在django 1.11中确认这一点。如果你在这里加上这个答案,我会接受的。如果在这里被接受为正确答案,我将把我的问题与这个问题联系起来。
from django import forms

class MyForm(forms.ModelForm):

    myfield = forms.DateField(widget=forms.SelectDateWidget(empty_label=(u'year', u'month', u'day')),
                              required=False)

    def clean_myfield(self):
        value = self.cleaned_data['myfield']
        if not value:
            raise forms.ValidationError(u'Please fill out myfield')
        return value