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 验证。因此,您仍然应该在模型(或表单字段)中添加一个验证器,以防止例如伪造请求。
我在 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 验证。因此,您仍然应该在模型(或表单字段)中添加一个验证器,以防止例如伪造请求。