Django: возможно ли установить ограничения виджета DateInput для максимальной и минимальной дат?
мой виджет Date в 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(),
}
Проблема в том, что когда кто-то вводит дату слишком далеко в будущее/прошлое, некоторые другие части приложения становятся беспорядочными (например, графики и другие вещи).
Я пробовал следующее:
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 DateInput(DateInput):
input_type = 'date'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.attrs.setdefault('min', '2020-01-01')
Используя .setdefault(…) [Python-doc], он не будет переопределять другое значение, если вы укажете его при построении DateInput объекта.
Обратите внимание, что виджет не проверяется Django. Поэтому вам все равно следует добавить валидатор в модель (или поле формы) для защиты от, например, поддельных запросов.