Как сделать ограничение времени в Django forms?

Помогите разобраться, что не так. Даже ошибок нет, сохранение так и проходит с неправильной датой. Спасибо, кто поможет найти причину. Надо, чтобы пользователь не смог выбрать дату в прошлом (только сегодняшнего дня ) и не смог выбрать дату превышающую больше двух недель. Думаю так понятней 16 < и > 14 дней +.

Forms.py:

class AdvertisingForm(forms.Form):
    period_n = forms.DateTimeField(help_text='Выберите дату и время!', widget=forms.SelectDateWidget())
    period_c = forms.DateTimeField(help_text='Выберите дату и время!', widget=forms.SelectDateWidget())


def clean_renewal_date(self):
    date_n = self.cleaned_data['period_n']
    date_c = self.cleaned_data['period_c']
    # Проверка того, что дата не выходит за "нижнюю" границу (не в прошлом).
    if date_n and date_c < datetime.date.today():
        raise forms.ValidationError('Invalid date - renewal in past')
    # Проверка того, то дата не выходит за "верхнюю" границу (+2 недели).
    if date_n and date_c > datetime.date.today() + datetime.timedelta(weeks=2):
        raise forms.ValidationError('Invalid date - renewal more than 2 weeks ahead')
    # Помните, что всегда надо возвращать "очищенные" данные.
    return date_n, date_c

views.py

def target(request):
geography_city_and_region = Geography.objects.all()
if request.method == "POST":
    form = AdvertisingForm(request.POST)
    geo = Geography.objects.get(Region=request.POST.get('region'), City=request.POST.get('city'))
    if form.is_valid():
        form.period_c = form.cleaned_data['period_c']
        form.period_n = form.cleaned_data['period_n']
        form.save(request.POST, geo, request.user)
        return HttpResponseRedirect(reverse('thank_you'))
else:
    proposed_renewal_date = datetime.date.today() + datetime.timedelta(weeks=0)
    form = AdvertisingForm(initial={'period_n': proposed_renewal_date, 'period_c': proposed_renewal_date})
context = {
    'form': form,
    'geography_city_and_region': geography_city_and_region,
}
return render(request, 'advertising/target.html', context)

Ответы (1 шт):

Автор решения: Sergey Gornostaev

Стоит сначала выучить Python, а уж потом браться за Django. Выражение

if date_n and date_c < datetime.date.today():

Означает "если date_n истинно и date_c меньше datetime.date.today()". Для типа datetime ложным будет только None, соответственно это условное выражение будет срабатывать всегда, когда date_n передано.

→ Ссылка