Django self.cleaned_data Keyerror

Estoy escribiendo un sitio web de Django y estoy escribiendo mi propia validación para un formulario:

class CreateJobOpportunityForm(forms.Form): subject = forms.CharField(max_length=30) start_date = forms.DateField(widget=SelectDateWidget) end_date = forms.DateField(widget=SelectDateWidget) def clean_start_date(self): start_date = self.cleaned_data['start_date'] end_date = self.cleaned_data['end_date'] if start_date > end_date : raise forms.ValidationError("Start date should be before end date.") return start_date 

pero cuando la fecha_inicial es menor que la fecha final, dice:

 KeyError at /create_job_opportunity 'end_date' 

¿Por qué no reconoce la clave 'end_date' ?

Dado que un campo depende de otro campo, es mejor si realizó la limpieza en el método de clean para el formulario, en lugar del método de campo de clean_field individual.

 def clean(self): cleaned_data = super(CreateJobOpportunityForm, self).clean() end_date = cleaned_data['end_date'] start_date = cleaned_data['start_date'] # do your cleaning here return cleaned_data 

De lo contrario, tendría que asegurarse de que su campo de fecha end_date se limpie antes de la fecha start_date .

Esto sucede porque usted intenta obtener clean_data de end_date antes de verificar que end_date sea válido o no. si declara la fecha de finalización antes de que se valide la fecha de inicio en este caso, se valida la fecha de finalización, después de lo cual se llama a clean_start_date. Declare end_date antes de la start_date así:

 class CreateJobOpportunityForm(forms.Form): subject = forms.CharField(max_length=30) end_date = forms.DateField(widget=SelectDateWidget) start_date = forms.DateField(widget=SelectDateWidget) def clean_start_date(self): start_date = self.cleaned_data['start_date'] end_date = self.cleaned_data['end_date'] if start_date > end_date : raise forms.ValidationError("Start date should be before end date.") return start_date 

Reemplazar

 end_date = self.cleaned_data['end_date'] 

con

 end_date = self.data.get('end_date') 

O

Limpie el campo end_date antes de start_date .