根据Django的SelectDateWidget文档(https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#selectdatewidget),如果不需要empty_label
,则会显示DateField
。我注意到如果需要DateField
,则小部件上的默认值将为January
,1
和<current-year>
。有没有办法让DateField
成为必需,但在初始表单上显示带有empty_label
的小部件(例如-----)?
答案 0 :(得分:8)
不幸的是,SelectDateWidget
中的空标签仅在不需要字段时使用,但您可以通过继承SelectDateWidget
并覆盖create_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
但在这种情况下,你可能还必须覆盖你的字段的验证,因此它会抛出该字段所需的错误,而当选择留在空白值时,选择无效。
答案 1 :(得分:1)
尽管create_select
在最新版本的Django中已删除,但我仍然可以通过将SelectDateWidget子类化并覆盖get_context来使用与@GwynBleidD的答案非常相似的方法。
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
答案 2 :(得分:0)
看着SelectDateWidget的代码,没有很好的方法(django 2.1.4)。 我的解决方案是在客户端添加空白选项(使用jquery):
$(document).ready(function() {
$('#select-widget-id select').each(function() {
if(!$(this).children('[value=""], [selected]').length) {
$(this).prepend('<option value="" selected="selected">---</option>');
}
});
});
答案 3 :(得分:0)
另一种解决方法是将表单字段设置为可选(required = False),并实施自定义验证以确保该字段包含内容:
GET