ich ein Modell, das wie folgt aussieht:, Ich versuche Grundsätzlichhinzufügen Felder Django Modelform, die nicht im Modell ist
class MyScheduleForm(forms.ModelForm):
startdate=forms.DateField()
starthour=forms.ChoiceField(choices=((6,"6am"),(7,"7am"),(8,"8am"),(9,"9am"),(10,"10am"),(11,"11am"),
(12,"noon"),(13,"1pm"),(14,"2pm"),(15,"3pm"),(16,"4pm"),(17,"5pm"),
(18,"6pm"
startminute=forms.ChoiceField(choices=((0,":00"),(15,":15"),(30,":30"),(45,":45")))),(19,"7pm"),(20,"8pm"),(21,"9pm"),(22,"10pm"),(23,"11pm")))
class Meta:
model=MySchedule
def clean(self):
starttime=time(int(self.cleaned_data.get('starthour')),int(self.cleaned_data.get('startminute')))
return self.cleaned_data
try:
self.instance.start_datetime=datetime.combine(self.cleaned_data.get("startdate"),starttime)
except TypeError:
raise forms.ValidationError("There's a problem with your start or end date")
zu:
class MySchedule(models.Model):
start_datetime=models.DateTimeField()
name=models.CharField('Name',max_length=75)
Mit ihm kommt seine Modelform brechen Sie das DateTime-Feld im Modell in 3 einfacher zu verwendende Formularfelder auf - eine Datumsauswahl, eine Stunden-Dropdown-Liste und eine Minuten-Dropdown-Liste. Nachdem ich die drei Eingaben erhalten habe, setze ich sie zu einer DateTime zusammen und speichere sie im Modell.
Ein paar Fragen:
1) Ist der völlig der falsche Weg, um es zu tun? Ich möchte keine Felder im Modell für Stunden, Minuten usw. erstellen, da dies alles nur zwischenzeitliche Daten sind. Daher möchte ich eine Möglichkeit, das DateTime-Feld in Unterfelder zu zerlegen.
2) Die Schwierigkeit, auf die ich stoße, ist, wenn das Feld startdate leer ist - es scheint, als würde es nie auf Nichtleerheit geprüft werden, und es endet nur später ein TypeError, wenn das Programm ein Datum erwartet und bekommt keine. Wo überprüft Django auf leere Eingaben und löst den Fehler aus, der schließlich in das Formular zurückkehrt? Ist das meine Verantwortung? Wenn ja, wie mache ich das, da es clean_startdate() nicht auswertet, da das Startdatum nicht im Modell ist.
3) Gibt es einen besseren Weg, dies mit Vererbung zu tun? Vielleicht das MyScheduleForm in BetterScheduleForm erben und die Felder dort hinzufügen? Wie würde ich das tun? (Ich habe über eine Stunde damit herum gespielt und kann es anscheinend nicht bekommen)
Danke!
[Edit:] die Rückkehr self.cleaned_data links aus - verloren sie in der Copy/Paste ursprünglich
Im Allgemeinen kann das ModelForm enthalten, welche Felder Sie möchten. Es ist wie eine normale Form in dieser Hinsicht. Die einzige Sorge ist, dass Sie die Anfangsdaten, die entsprechenden clean() -Methoden und die entsprechende save() -Methode implementieren müssen, wenn diese Felder nicht im Modell vorhanden sind, da ein ModelForm versucht, diese Dinge automatisch zu erzeugen das Model. – Cerin