2016-05-10 14 views
1

Ich habe eine Reihe von Ansichten, die eine Reihe von Assoziationen erstellt und löst dann eine Aktion basierend auf dieser Zuordnung.Django serviert veraltete Form Validierung Optionen

Für die Validierung habe ich eine benutzerdefinierte Funktion in forms.py erstellt und diese verwenden, um die anfänglichen Auswahl/Validierungswerte zu füllen.

def targets(): 
    o = [] 
    for r in Target.objects.all(): 
     o.append((r.pk, r.host.statline())) 
    return o 

class StageForm(forms.Form): 
    targets = forms.MultipleChoiceField(choices=targets(), widget=forms.CheckboxSelectMultiple()) 

In der Ansicht, berechne ich eine neue Liste mit dem Bauobjekt relevant, zu überprüfen, sicherzustellen, dass alle erforderlichen Parameter definiert wurden, und trägt vor, wie die angebotenen Optionen aus.

hl = Target.objects.filter(build=b) 
    cl = [] 
    for h in hl: 
     if h.host.ready(): 
      cl.append((h.pk, h.host.statline())) 
     form.fields['targets'].choices = cl 

Das Problem, das ich zu sehen bin, ist, dass, wenn ich einen neuen Wirt in der Umwelt hinzuzufügen, die Form arbeitet wie ich erwarte, und stellt die Hosts bereit für einen Build, aber dann die dargestellte Option nicht Validierung.

Die Liste, die ich vom Build erzeuge und die Liste, die ich für die Validierung erzeuge, kommt von der gleichen Stelle, und der neue Host ist eindeutig in der Tabelle, aber nicht zur Validierung, bis ich den Entwicklungsserver neu starte .

Um die Fremdheit hinzuzufügen, bekomme ich die erwarteten Ergebnisse von der manage.py shell, während das Formular immer noch mit veralteten Daten validiert.

Ist dies nur, weil ich auf dem Entwicklungsserver laufen, oder ist meine Methodik hier einfach unhaltbar und sollte auf die __init__ Methode überschrieben werden?

Antwort

1

Sie sollten ModelMultipleChoiceField mit einem Abfrage-Set verwenden.

class StageForm(forms.Form): 
    targets = forms.ModelMultipleChoiceField(queryset=Target.objects.all(), widget=forms.CheckboxSelectMultiple()) 

(Wenn das Ziel String-Darstellung des korrekten Anzeigewert nicht ausgegeben hat, können Sie das Feld Unterklasse und label_from_formset definieren, wie in the docs gezeigt.

+0

Dank, scheint dies den Trick getan zu haben! –