2017-02-27 3 views
0

I Transaction haben wie folgt:Django: Typeerror: ‚datetime.date‘ Objekt hat kein Attribut ‚get‘

class TransactionForm(ModelForm): 
    start_date = forms.DateField(widget=SelectDateWidget) 
    duration = forms.ChoiceField(choices=duration_choices) 
    class Meta: 
     model=Transaction 
     fields=(
     'start_date', 
     'duration', 
     ) 

    def clean(self): 
     date = self.cleaned_data.get("start_date") 

     if date < datetime.date.today(): 
     raise forms.ValidationError("The date cannot be in the past!") 
     return date 

es eine Methode sauber hat, die, wenn das Datum eingegeben prüft mindestens heutige oder mehr beträgt. Wenn ein Datum in der Vergangenheit eingefügt wird, zeigt es einen Fehler bei remplate wie erwartet. Aber wenn ein gültiges Datum eingegeben wird, erhalte ich den folgenden Fehler.

'datetime.date' object has no attribute 'get'

Hier ist meine view.py Datei

def packages(req): 
    if req.method == 'POST': 
     form = completeForm(req.POST) 
     tf = TransactionForm(req.POST) 

     if tf.is_valid(): 
      return HttpResponse("Some page") 
     else: 
      errorList = tf.errors['__all__'] 
      args={'form':form, 'errors':errorList, 'tf':tf} 
      return render(req,'main/common/packages.html',args) 

    else: 
     form = completeForm() 
     tf = TransactionForm() 
     args={'form':form, 'counter':1, 'tf':tf} 
     return render(req,'main/common/packages.html',args) 

Wenn ich saubere Methode aus Form entfernen es funktioniert gut, aber ich brauche Datum auswerten, ohne JavaScript-Validierung zu verwenden.

Ich fand this Frage am nächsten bei mir, aber seine Lösung funktioniert nicht oder ich. Könntest du bitte, was mache ich falsch?

Antwort

1

Sie können mehrere Felder validieren über, so schlage ich diese statt def sauber (Selbst-) versuchen:

def clean_start_date(self): 
    st_date = self.cleaned_data.get("start_date") 

    if st_date < datetime.date.today(): 
     raise forms.ValidationError("The date cannot be in the past!") 
    return st_date 

Edit: Wenn Sie mehrere Felder zu validieren über versuchte zu, dass dies der Fall wäre wenn documentation schlägt vor, benutzerdefinierte saubere Funktion zu verwenden.

+0

Hallo Mxle, Vielen Dank für Ihre schnelle Antwort. Es funktioniert. Könntest du mir bitte erklären, warum es nicht funktioniert hat, als ich die saubere Methode außer Kraft gesetzt habe? Was genau hat hier den Unterschied gemacht? –

+1

Meine Idee ist, dass Sie _date_ Wort für eine Variable verwendet haben. Die Verwendung solcher Wörter (und Liste, Diktat usw.) kann alle möglichen magischen Fehler verursachen. – mxle

Verwandte Themen