2017-02-26 2 views
1

In der Ansicht: Ich muss eine Dropdown-Liste der Jahre von einem festen Wert (etwa 2005) bis zum aktuellen Jahr anzeigen. Nun kommt diese Liste, obwohl dynamisch, nicht aus der Datenbank. Außerdem möchte ich, dass die Liste im Laufe der Zeit erweitert wird.HTML Dropdown-Liste mit dynamischer Liste in Django ModelForm

Im Modell: Ich möchte, dass dieses Feld wie ein IntegerField (?) Ist, das nur Werte von 2005 bis 3000 speichert und sonst einen Validierungsfehler auslöst.

Was ich tun könnte - Machen Sie das Dropdown als ChoiceField in der Ansicht und richten Sie einen Validator für das Modell ein.

Was ich will - ich möchte ModelForm in Django verwenden, da dieses Feld zusammen mit anderen im Formular auf die Felder meines Modells abbildet. Das bedeutet, dass ich Felder in meiner Form nicht definieren werde, sondern nur im Modell. Die Frage ist also, wie soll ich vorgehen?

Das habe ich so weit versucht

class Member(models.Model): 
    d = int(datetime.datetime.now().strftime("%Y")) 
    ch = [(X,X) for X in range(2005,d)] 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    membership_type = models.IntegerField(validators=[validate_membership_type]) 
    batch = models.IntegerField(choices= ch) 

Dies erzeugt das Formular mit den gewünschten Auswahlfeld aber die Werte nicht ändern. Ich habe "Jahre" durch "Minuten" ersetzt, um es zu testen, und der Bereich bleibt mit der oberen Grenze als die Anzahl der Minuten zum Zeitpunkt des Starts des Servers, d. H. Wenn das Modell erstellt wird, fest. Ich möchte, dass dieser Bereich von der Ansicht bestimmt wird, d. H. Wenn das Formular in den Browser geladen wird.

Antwort

1

Erstens gehört dieser Code nicht in das Modell, sondern in das Formular.

Zweitens, wenn Sie Dinge brauchen, um dynamisch zu sein, müssen sie in der __init__ Methode gehen, nicht auf Klassenebene. Also:

+0

Danke Daniel für die schnelle Antwort. Nur eine Sache, was meintest du mit 'dieser Code gehört nicht in das Modell, sondern in der Form'? Beziehen Sie sich auf die ersten beiden Zeilen und implizieren, dass eine solche Logik nicht Teil des Modells sein sollte? (Weil ich mein Modell mit Hilfe des Rests des "Codes" definieren muss, nein?) – kshubham07

+0

Ja, ich meine die dynamischen Auswahlsachen. Offensichtlich sind die Felddefinitionen Teil des Modells, aber Sie sollten die Auswahlmöglichkeiten von dort vollständig entfernen. –

+0

Hi Daniel, die Anweisung 'self.fields ['batch']. Choices = ch 'funktioniert nicht, weil IntegerField von Formularen kein Auswahl-Attribut hat (das der Klasse models). Ich habe es in 'self.fields ['batch'] geändert. Widget = forms.Select (choices = ch)' und es hat funktioniert. Bitte nehmen Sie diese Änderung in Ihrer Antwort vor und ich werde sie als richtig markieren. Danke für Ihre Hilfe (y) – kshubham07