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. Поэтому вам все равно следует добавить валидатор в модель (или поле формы) для защиты от, например, поддельных запросов.

Вернуться на верх