Python django 1.11中SelectDateWidget的空选项

Python django 1.11中SelectDateWidget的空选项,python,django,Python,Django,对于SelectDateWidget,Django文档说明如下: 如果日期字段不是必需的,则SelectDateWidget将有一个空字段 默认情况下,位于列表顶部的选项。你可以 使用空标签属性更改此标签的文本。 空标签可以是字符串、列表或元组。当使用字符串时, 所有选择框都有一个带有此标签的空选项。如果 空标签是由3个字符串元素组成的列表或元组,选择框 将有自己的自定义标签。标签应按此顺序排列 “年标签”、“月标签”、“日标签” 但是,我不清楚如何使用必需的日期字段设置空选项?我认为这不是一种

对于SelectDateWidget,Django文档说明如下:

如果日期字段不是必需的,则SelectDateWidget将有一个空字段 默认情况下,位于列表顶部的选项。你可以 使用空标签属性更改此标签的文本。 空标签可以是字符串、列表或元组。当使用字符串时, 所有选择框都有一个带有此标签的空选项。如果 空标签是由3个字符串元素组成的列表或元组,选择框 将有自己的自定义标签。标签应按此顺序排列 “年标签”、“月标签”、“日标签”

但是,我不清楚如何使用必需的日期字段设置空选项?我认为这不是一种罕见的情况:如果没有空的选项,但是预先选择了默认值,就可以轻松地跳过所需的日期字段,并使用默认值保存它,而不需要注意


有人知道怎么做吗?

不幸的是,看看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>');
    }
  });
});

我可以通过子类化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

这个答案与GwynBleidD在这里的线程中的答案类似:,但已更新以使用Django的最新版本。

是的,这是非常基本的,但我找不到现成的解决方案。你能找到解决办法吗?不太可能。目前,我在models.py date=models.DateTimeFieldblank=True和forms.py self.fields['date'].required=True中使用了。这样,我就可以在用户使用的自定义表单中获得所需的行为。但是,如果您想在django admin中编辑对象,它不会标记所需的日期字段,也不会抱怨您需要在表单级别输入值,但单击“保存”后,您将在“日期”列中获得空值,违反了非空约束。因此,这显然不是正确的方法,但我不知道其他方法。朱利安·戈(Julian Go)链接的帖子中公认答案的可能重复在最近的Django版本中不再有效,但我只是添加了一个适用于这些情况的答案。