在 Django 上所需的 selectDateWidget 上显示 empty_label

Posted

技术标签:

【中文标题】在 Django 上所需的 selectDateWidget 上显示 empty_label【英文标题】:Display empty_label on required selectDateWidget on Django 【发布时间】:2015-11-29 10:49:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:

不幸的是,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

But in that case you may have to override also validation of your field, so it will throw error that field is required, not that choice is invalid when select is left on blank value.

【讨论】:

好极了。当所有 3 个字段为空时抛出的错误是“此字段是必需的”,当 1 个或多个字段为空时是“输入有效日期”。我认为这很完美。谢谢。 我认为验证没有准备好,但看起来确实如此。 在 django 1.11 中(可能在早期版本中也是如此)这将不再起作用。 SelectDateWidget 似乎已被重写。 create_select 函数不再使用。【参考方案2】:

虽然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

【讨论】:

我可以确认这在 django 1.11 中有效。如果您在此处添加此答案:***.com/questions/50091004/…,我会接受。如果在这里被接受为正确答案,我会将我的问题链接到这个问题。【参考方案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>');
    
  );
);

【讨论】:

【参考方案4】:

另一种解决方法是将表单字段设置为可选(必需=False)并实施自定义验证以确保该字段具有内容:

from django import forms

class MyForm(forms.ModelForm):

    myfield = forms.DateField(widget=forms.SelectDateWidget(empty_label=(u'year', u'month', u'day')),
                              required=False)

    def clean_myfield(self):
        value = self.cleaned_data['myfield']
        if not value:
            raise forms.ValidationError(u'Please fill out myfield')
        return value

【讨论】:

以上是关于在 Django 上所需的 selectDateWidget 上显示 empty_label的主要内容,如果未能解决你的问题,请参考以下文章

带有 typescript 的 React 路由器 v5 上所需的 url 参数,可以是未定义的

如何计算呈现 Django 管理页面所需的 SQL 查询数?

使用 django 和 AngularJS 使用 JWT 登录所需的装饰器

如果在 django 中使用多个数据库,如何仅迁移所需的模型表

Django - 获取反转url所需的参数名称

Django:引导输入组未使用表单呈现所需的 HTML/CSS