Django:是否可以为最大和最小日期设置 DateInput 小部件限制?

Django: is it possible to set DateInput widget limits for maximum and minimum dates?

我在 forms.py 中的日期小部件如下所示:

class DateInput(DateInput):
    input_type = 'date'


class TaskCreateForm(ModelForm):
    class Meta:
        model = TaskModel
        fields = '__all__'
        exclude = ('task_project',)
        widgets = {
            'task_baseline_start': DateInput(),
            'task_baseline_finish': DateInput(),
            'task_scheduled_start': DateInput(),
            'task_scheduled_finish': DateInput(),
            'task_real_start': DateInput(),
            'task_real_finish': DateInput(),
        }

问题是每当有人在 future/past 中引入一个过远的日期时,应用程序的其他部分就会变得一团糟(比如图表和其他东西)。

我试过以下方法:

class DateInput(DateInput):
    input_type = 'date'
    attrs = {'min': '2020-01-01'}

但是小部件一直接受 2020-01-01 之前的日期。

编辑:如果我在每个“DateInput()”实例上设置属性,小部件将遵守限制,即:

class TaskCreateForm(ModelForm):
    class Meta:
        model = TaskModel
        fields = '__all__'
        exclude = ('task_project',)
        widgets = {
            'task_baseline_start': DateInput(attrs={'min':'2019-01-01'}),
            'task_baseline_finish': DateInput(attrs={'min':'2019-01-01'}),
            'task_scheduled_start': DateInput(attrs={'min':'2019-01-01'}),
            'task_scheduled_finish': DateInput(attrs={'min':'2019-01-01'}),
            'task_real_start': DateInput(attrs={'min':'2019-01-01'}),
            'task_real_finish': DateInput(attrs={'min':'2019-01-01'}),
        }

现在这段代码伤害了我的感情,我觉得完全不尊重 DRY 标准。有没有更好的方法只设置一次这个约束?

非常感谢!

小部件不查看 attrs class 属性。您可以将其添加到克隆中,因此:

class DateInput(DateInput):
    input_type = 'date'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.attrs<strong>.setdefault(</strong>'min', '2020-01-01'<strong>)</strong>

通过使用 .setdefault(…) [Python-doc],如果您在构造 DateInput 对象时指定一个值,它不会覆盖不同的值。

请注意,小部件 由 Django 验证。因此,您仍然应该在模型(或表单字段)中添加一个验证器,以防止例如伪造请求。