Je suis en train de soulever une erreur de validation où:django - Formulaire ValidationError ne fonctionne pas
1) si la date sélectionnée dans le champ start_date
est la veille aujourd'hui il soulèvera et erreur. quand je le soumets jeter cette erreur
'<' pas pris en charge entre les instances de 'NoneType' et 'datetime.date'
2) si la date de fin est une date antérieure à la date de début, il va générer une autre erreur. Pour cette partie son travail partiel où je ne sauve pas le formulaire soumis mais il ne soulève pas et erreur de validation
Je sais que ce n'est pas la première fois que quelqu'un pose cette question mais j'ai suivi la réponse donnée par d'autres et c'est ne fonctionne pas, où je me trompe?
Toute aide est très appréciable.
Ci-dessous mon code:
model.py:
class Leave(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='+')
start_date = models.DateField()
end_date = models.DateField()
duration = models.FloatField()
form.py:
class LeavesDetailForm(forms.ModelForm):
class Meta:
model = Leave
fields = ('employee', 'type', 'status', 'start_date', 'end_date', 'duration', 'comment')
widgets = {'start_date': forms.DateInput(attrs={'type': 'date'}),
'end_date': forms.DateInput(attrs={'type': 'date'}),
'employee': forms.HiddenInput(),
'duration': forms.HiddenInput(),
'status': forms.HiddenInput()}
def clean(self):
start_date = self.cleaned_data.get("start_date")
end_date = self.cleaned_data.get("end_date")
if end_date < start_date:
msg = u"End date should be greater than start date."
self._errors["end_date"] = self.error_class([msg])
raise forms.ValidationError("End date should be greater than start date.!")
def clean_start_date(self):
start_date = self.cleaned_data.get('start_date')
if self.instance.start_date < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past!")
return start_date
view.py:
def my_leaves_view(request):
form = LeavesDetailForm(request.POST or None)
leaves_log = Leave.objects.all().filter(employee=request.user.profile.employee.id)
if form.is_valid():
inst = form.save(commit=False)
inst.start_date = form.cleaned_data['start_date']
inst.end_date = form.cleaned_data['end_date']
duration = (inst.end_date - inst.start_date).days
inst.duration = duration
inst.save()
return HttpResponseRedirect('my_leaves_content.html')
context = {'form': form}
return render(request, 'hrm/my_leaves/my_leaves_content.html', context)
Salut @Jahongir I switch 'def clean_date (self):' à 'def clean_start_date (self):' mais malheureusement, il ne fonctionne toujours pas. –