Как сделать ограничение времени в 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 передано.