在Django上的必需selectDateWidget上显示empty_label

时间:2015-09-03 14:26:26

标签: python django python-2.7 django-models django-forms

根据Django的SelectDateWidget文档(https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#selectdatewidget),如果不需要empty_label,则会显示DateField。我注意到如果需要DateField,则小部件上的默认值将为January1<current-year>。有没有办法让DateField成为必需,但在初始表单上显示带有empty_label的小部件(例如-----)?

4 个答案:

答案 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