Django: как заставить работать функцию clean
У меня есть функция для проверки того, что поле даты не меньше сегодняшней даты, но она не работает, когда я отправляю данные через форму, функция ничего не делает.
forms.py
class CrearTareaForm(forms.ModelForm):
descripcion = forms.CharField(max_length=500, required=True, widget=forms.TextInput(attrs={'placeholder':'Ingrese Descripcion'}))
inicio = forms.DateTimeField(
input_formats= ['%Y-%m-%dT%H:%M'],
required=True,
widget=forms.DateTimeInput(
attrs={
'type': 'datetime-local',
'class': 'form-control'
}
))
def clean_inicio(self):
inicio = self.cleaned_data['inicio']
if inicio < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past!")
return inicio
views.py
def creartarea(request):
data = {
'tarea': CrearTareaForm()
}
if request.method=="POST":
if request.POST.get('nombre') and request.POST.get('descripcion') and request.POST.get('inicio') and request.POST.get('termino') and request.POST.get('repetible') and request.POST.get('activo') and request.POST.get('estado') and request.POST.get('creador') and request.POST.get('tarea_anterior'):
tareasave= Tarea()
tareasave.nombre=request.POST.get('nombre')
tareasave.descripcion=request.POST.get('descripcion')
tareasave.inicio=request.POST.get('inicio')
tareasave.termino=request.POST.get('termino')
tareasave.repetible=request.POST.get('repetible')
tareasave.activo=request.POST.get('activo')
tareasave.estado=EstadoTarea.objects.get(pk=(request.POST.get('estado')))
tareasave.creador=Empleado.objects.get(rut=(request.POST.get('creador')))
tareasave.tarea_anterior=Tarea(pk=(request.POST.get('tarea_anterior')))
cursor=connection.cursor()
cursor.execute("call SP_crear_tarea('"+tareasave.nombre+"','"+tareasave.descripcion+"', '"+tareasave.inicio+"', '"+tareasave.termino+"', '"+tareasave.repetible+"', '"+tareasave.activo+"', '"+str(tareasave.estado.id)+"', '"+str(tareasave.creador.rut)+"', '"+str(tareasave.tarea_anterior.id)+"')")
messages.success(request, "La tarea "+tareasave.nombre+" se guardo correctamente ")
return render(request, 'app/creartarea.html', data)
else:
return render(request, 'app/creartarea.html', data)
помогите мне пожалуйста!!!!
Вы должны определить метод clean_inicio
внутри ModelForm, также inicio
является DateTimeField
, поэтому вы должны сначала извлечь его date
, а затем сравнить с текущей датой, так:
class CrearTareaForm(forms.ModelForm):
descripcion = forms.CharField(max_length=500, required=True, widget=forms.TextInput(attrs={'placeholder':'Ingrese Descripcion'}))
inicio = forms.DateTimeField(
input_formats= ['%Y-%m-%dT%H:%M'],
required=True,
widget=forms.DateTimeInput(
attrs={
'type': 'datetime-local',
'class': 'form-control'
}
))
def clean_inicio(self):
inicio = self.cleaned_data['inicio']
if inicio.date < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past!")
return inicio