Django SelectDateWidget

date_range = 100    
this_year = date.today().year
birth_date= forms.DateField(label='What is your birth date?', widget=forms.SelectDateWidget(years=range(this_year - date_range, this_year+1)))

Я хотел бы выбирать только даты через 100 лет после сегодняшнего дня. Но сейчас я могу получить значения типа 31 декабря 2021 года, где иногда месяцы и дни не совпадают с правильными значениями.

Django ожидает список или кортеж для years параметра в SelectDateWidget. Попробуйте использовать:

this_year = date.today().year
year_range = [x for x in range(this_year - 100, this_year + 1)]
birth_date = forms.DateField(
    label="What is your birth date?",
    widget=forms.SelectDateWidget(years=year_range),
)

Добавьте валидатор поля формы, если вы хотите проверить наличие выбранной даты в определенном диапазоне. Вот пример с наивным расчетом на 100 лет назад:

from datetime import datetime, timedelta

class YourForm():
    ...

    def clean_birth_date(self):
        birth_date = self.cleaned_data['birth_date']

        today = datetime.today()
        first_date = today - timedelta(days=100 * 365)

        if not (first_date < birth_date < today):
            raise ValidationError("Please select a date within the last 100 years")

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