Python django 1.11中SelectDateWidget的空选项
对于SelectDateWidget,Django文档说明如下: 如果日期字段不是必需的,则SelectDateWidget将有一个空字段 默认情况下,位于列表顶部的选项。你可以 使用空标签属性更改此标签的文本。 空标签可以是字符串、列表或元组。当使用字符串时, 所有选择框都有一个带有此标签的空选项。如果 空标签是由3个字符串元素组成的列表或元组,选择框 将有自己的自定义标签。标签应按此顺序排列 “年标签”、“月标签”、“日标签” 但是,我不清楚如何使用必需的日期字段设置空选项?我认为这不是一种罕见的情况:如果没有空的选项,但是预先选择了默认值,就可以轻松地跳过所需的日期字段,并使用默认值保存它,而不需要注意Python django 1.11中SelectDateWidget的空选项,python,django,Python,Django,对于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版本中不再有效,但我只是添加了一个适用于这些情况的答案。