Initialise Custom Forms

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

Hi,

bekannterweise gibt es in Django die Möglichkeiten HTML Forms von der Applikationsseite aus zu erzeugen und dann lediglich im Template auszugeben. Ich möchte gerne ein Form mit ChoiceFields benutzen, das ich zur Laufzeit mit Daten initialisiere. Dies jedoch scheint ein mittleres Problem zu. Ich habe schon diverse Webseiten gefunden, die Tips geben und scheinbar rendert das Template die Forms dann auch entsprechend, aber die Validierung scheint nicht mehr korrekt zu funktionieren. Wenn ich eine Option der ComboBox wähle und das Form validiere, bekomme ich einen Fehler. Dies ist sicherlich auf die anfängliche Initialisierung des ChoiceFields auf ein leeres Tuple zurückzuführen...

Hier mal ein bisschen Code:

Code: Alles auswählen

class MyForm(forms.Form):
  courses = forms.ChoiceField(
    choices = (), required=False)

  def __init__(self, choices, *args, **kwags):
    super(MyForm, self).__init__(*args, **kwargs)
    if choices == None: return
    self.fields['courses'].choices = [('abc', 'abc'), ('123', '123')]
Diese Konstruktion funktioniert auch wunderbar, aber wenn ich wie gesagt:

Code: Alles auswählen

form = MyFor(None, request.POST)
print form.is_valid, form.errors
bekomme ich Fehlermeldungen, die mir sagen, dass die getroffene Auswahl nicht korrekt ist.

Hat jemand vielleicht eine Idee?

Lg,
lunas
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Kann dein Problem nicht nachstellen. Dies hier gibt immer True:

Code: Alles auswählen

print MyForm(None, {}).is_valid()
print MyForm(None, {'choices': ''}).is_valid()
print MyForm(None, {'choices': 'whatever'}).is_valid()
Stefan
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

Die zweite und dritte Zeile sollte eigentlich False zurückgeben, weil das Form nicht initialisiert wird und deshalb nur [] ein gültiger Wert ist. Aber ich habe meinen Fehler schon gefunden. Und zwar muss ich das Form natürlich auch genauso initialisieren wie ich es zum Template geschickt habe, also anstatt:

Code: Alles auswählen

MyForm(None, request.POST)
muss es

Code: Alles auswählen

MyForm({'choices': 'whatever'}, request.POST)
sein. Trotzdem danke. Dein Post hat mich auf die richtige Idee gebracht.
Antworten