Python 在Django上所需的selectDateWidget上显示空的\u标签
根据Django在SelectDateWidget()上的文档,如果不需要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
日期字段
,将显示空标签
。我注意到,如果需要日期字段
,小部件上的默认值将是一月
、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