2017-08-15 5 views
0

Ich versuche Validierungsfehler zu erhöhen, wo:django - Form Validation funktioniert nicht

1), wenn die in dem start_date Feld gewählte Datum dem Tag vor dem heutigen Tag ist, dann wird es erhöhen und Fehler. wenn ich eintragen diesen Fehler werfen

‚<‘ nicht zwischen Instanzen von ‚NoneType‘ und ‚datetime.date‘ unterstützt

2), wenn das Enddatum ein Datum vor dem Startdatum ist, es wird einen weiteren Fehler auslösen. Für diesen Teil ist es teilweise Arbeit, wo ich nicht das gesendete Formular speichert, aber es nicht erhöht und Validierungsfehler

Ich weiß, das ist nicht das erste Mal, dass jemand diese Frage stellen, aber ich folgte der Antwort von anderen gegeben und es ist funktioniert nicht, wo mache ich falsch?

Jede Hilfe ist sehr zu schätzen.

Unten ist mein 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: nur

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) 

Antwort

0

aussieht wie du benannte die Funktion falsch. Ändern Sie clean_date zu clean_start_date, wie es im Format clean_function_name sein sollte.

Hoffe es hilft!

+0

Hi @Jahongir Ich wechsel 'def clean_date (self): 'zu' def clean_start_date (self): 'aber leider funktioniert es immer noch nicht. –

0

Im clean Verfahren, start_date oder end_date kann None sein, wenn der Benutzer kein gültiges Datum eingereicht hat.

Wie der Fehler vermuten lässt, lässt Python eine date Instanz nicht mit None vergleichen.

Sie sollten überprüfen, ob Sie gültige Daten aus cleaned_data bekam, bevor Sie sie vergleichen:

if end_date is not None and start_date is not None and end_date < start_date: 

Im clean_start_date Methode sollten Sie start_date verwenden, die Sie geholt aus cleaned_data, nicht self.instance.start_date:

def clean_start_date(self): 
    start_date = self.cleaned_data.get('start_date') 
    if start_date < datetime.date.today(): 
     raise forms.ValidationError("The date cannot be in the past!") 
    return start_date 
+0

Hallo Danke für die Antwort @Alasdair, ich habe meine Bedingung in 'wenn Startdatum

+0

Die Felder werden einzeln gereinigt, bevor die 'clean' Methode ausgeführt wird. Wenn ein Feld ungültig ist, wird es nicht in 'cleaned_data' sein, wenn die' clean'-Methode ausgeführt wird, deshalb müssen Sie überprüfen, ob 'get()' 'None' zurückgibt. – Alasdair