【问题标题】:Empty choice with SelectDateWidget in django 1.11django 1.11 中 SelectDateWidget 的空选项
【发布时间】:2018-10-09 23:42:08
【问题描述】:

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

如果不需要 DateField,SelectDateWidget 将有一个空 列表顶部的选项(默认为 ---)。你可以 使用 empty_label 属性更改此标签的文本。 empty_label 可以是字符串、列表或元组。使用字符串时, 所有选择框都将有一个带有此标签的空选项。如果 empty_label 是 3 个字符串元素的列表或元组,选择框 将有自己的自定义标签。标签应按此顺序 ('year_label', 'month_label', 'day_label')。

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

有人知道怎么做吗?

【问题讨论】:

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

标签: python django


【解决方案1】:

我可以通过继承 SelectDateWidget 并覆盖 get_context 来做到这一点。

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 在此处的线程中的答案:Display empty_label on required selectDateWidget on Django,但已更新以适用于更新版本的 Django。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 2012-08-24
      • 2010-11-17
      • 1970-01-01
      • 2011-09-03
      • 2018-04-04
      • 2018-02-22
      • 1970-01-01
      • 2019-04-26
      相关资源
      最近更新 更多