Hallo Leute.
Ich arbeite gerade mit wtforms und bottle.
In einem Formular gibt es eine Checkbox, die wenn sie nicht 'gechecked' ist, auch nicht an das Script im POST übermittelt wird.
Wie bekomme ich es hin, das die Checkbox trotzdem übermittelt wird, auch wenn der Haken nicht gesetzt ist?
Stehe gerade mächtig auf dem Schlauch.
Ich lasse mir aus dem übersendeten Formular eine Liste generieren. Leider fehlt dort dann die Checkbox. Um sie dort hinein zu bekommen dachte ich schon, es selber zu machen, das ist aber wie ich denke keine saubere Lösung.
Wenn ich mit wtforms, das Formular Objekt mit dem POST erstelle, habe ich die Checkbox mit drin, kann aber sonst nichts weiter mit anfangen, da ja dort der gesamte HTML code steht und ich keine Lust habe, diesen auseinander zu "parsen", das ist ja dann bestimmt auch nicht Sinn und Zweck der Sache.
Ich hoffe Ihr könnt mir dabei Helfen.
Gruß, deadshox
[wtforms][bottle] checkbox Übergabe.
- noisefloor
- User
- Beiträge: 4149
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
grundsätzlich finde ich das Verhalten "komisch". Normales HTML liefert für Checkboxen immer einen Wert...
Lt. Doku ist eine Checkbox ein "BooleanField". Heißt, dass nicht zurück geliefert wird kann eigentlich nicht sein. Es sollte wohl eher so sein, dass un-gecheckt "False" zurück geliefert wird.
Gruß, noisefloor
grundsätzlich finde ich das Verhalten "komisch". Normales HTML liefert für Checkboxen immer einen Wert...
Lt. Doku ist eine Checkbox ein "BooleanField". Heißt, dass nicht zurück geliefert wird kann eigentlich nicht sein. Es sollte wohl eher so sein, dass un-gecheckt "False" zurück geliefert wird.
Gruß, noisefloor
Das tut es auch
ist bei mir ein BooleanField
und gibt bei der Ausgabe im View
dann auch fein
Frank
Code: Alles auswählen
tracker.enabled = form.enabled.data
Code: Alles auswählen
enabled = BooleanField(u'Enabled?')
Code: Alles auswählen
<li>Enabled: {{ tracker.enabled }}</li>
oderEnabled: False
aus, wie erwartet.Enabled: True
Frank
Radio Buttons möchte ich nicht. Es muss damit Funktionieren! 
@noisefloor, ja, ich habe auch erwartet das wenigstens ein 'False' zurück geliefert wird. Wie kann ich das genau abfragen?
Eine vage Vermutung wäre noch, das es vielleicht an bottle liegt. Denn wenn ich über 'bottle.request.POST' oder 'bottle.request.forms' iteriere steht nirgends die Checkbox mit drin, außer sie ist halt "ge-checked".
@frabron, ich blicke bei deinem Code nicht durch, in wtforms und bottle gibt es kein 'enabled'. Könntest du es bitte ein wenig genauer beschreiben?

@noisefloor, ja, ich habe auch erwartet das wenigstens ein 'False' zurück geliefert wird. Wie kann ich das genau abfragen?
Eine vage Vermutung wäre noch, das es vielleicht an bottle liegt. Denn wenn ich über 'bottle.request.POST' oder 'bottle.request.forms' iteriere steht nirgends die Checkbox mit drin, außer sie ist halt "ge-checked".
@frabron, ich blicke bei deinem Code nicht durch, in wtforms und bottle gibt es kein 'enabled'. Könntest du es bitte ein wenig genauer beschreiben?
Ok, Kommando zurück.
Wenn ich über das Initialisierte Form Objekt iteriere und z.b. die ID abfrage, reicht mir das schon.
Ich wusste vorher nur nicht wie ich auf Dinge wie name, value, id, flags, ... zugreifen soll.
Danke für eure Antworten!
Wenn ich über das Initialisierte Form Objekt iteriere und z.b. die ID abfrage, reicht mir das schon.
Ich wusste vorher nur nicht wie ich auf Dinge wie name, value, id, flags, ... zugreifen soll.
Danke für eure Antworten!
Klar, das da oben ist ein Beispiel aus einer Anwendung von mir. Ich habe ein Formular
wo enabled halt ein BooleanField ist.
In meinem View:
Und die Ausgabe im Template:
Code: Alles auswählen
class EditTracker(TokenForm):
enabled = BooleanField(u'Enabled?')
valid_until = DateField(u'Valid Until', validators=[validators.required()])
events = SelectMultipleField(u'Associate events to tracker')
In meinem View:
Code: Alles auswählen
@tracker.route('/details/<imei>', methods=['POST','GET'])
def details(imei=None):
# ...
form = forms.EditTracker(formdata=request.form, events=selected)
# ....
if request.method == 'POST' and form.validate():
tracker.valid_until = form.valid_until.data
# hier wird der BooleanField Wert dem Tracker - Objekt zugeordnet
tracker.enabled = form.enabled.data
database.db_session.add(tracker)
database.db_session.commit()
return redirect(url_for('details', imei=tracker.imei))
return render_template('tracker/details.html', tracker=tracker, form=form)
Code: Alles auswählen
<h2>Details for Tracker {{ tracker.imei }}</h2>
<ul>
<li>Imei: {{ tracker.imei }}</li>
<li>Setup date: {{ tracker.setup_date }}</li>
<li>Valid until: {{ tracker.valid_until }}</li>
<li>Enabled: {{ tracker.enabled }}</li>
</ul>
Ok, scheint doch noch nicht gelöst zu sein.
Wenn ich das Formular via JavaScript erweitere, sendet bottle die neue Checkbox
nicht mit, wenn sie nicht "ge-checked" ist.
Dem entsprechend kann sie nicht in das Formular Objekt eingetragen werden und
existiert nicht mehr.
Ich erweitere ja das Formular Objekt mit den mitgelieferten POST Daten und ist
die Checkbox nicht drin, kann das Objekt ja nicht erweitert werden. Außer ich
mache ein extra HiddenField welches den 'False' Wert hat der Checkbox hat.
Kann das Problem einer Nachvollziehen?
Wenn ich das Formular via JavaScript erweitere, sendet bottle die neue Checkbox
nicht mit, wenn sie nicht "ge-checked" ist.
Dem entsprechend kann sie nicht in das Formular Objekt eingetragen werden und
existiert nicht mehr.
Ich erweitere ja das Formular Objekt mit den mitgelieferten POST Daten und ist
die Checkbox nicht drin, kann das Objekt ja nicht erweitert werden. Außer ich
mache ein extra HiddenField welches den 'False' Wert hat der Checkbox hat.
Kann das Problem einer Nachvollziehen?
Nö, so kann man das nicht nachvollziehen. In deiner Beschreibung sind zu viele unbekannte. Mal ganz abgesehen davon, dass Bottle keine Formulare versendet. Das Versenden von Formulardaten an den Server (da wo dein Bottle läuft) ist immer noch Sache des Browsers.
Wenn du das Formular mit JS erweiterst: Ist die Checkbox richtig platziert und formell richtig? Mal im Firebug gecheckt, was du da versendest?
Wenn du das Formular mit JS erweiterst: Ist die Checkbox richtig platziert und formell richtig? Mal im Firebug gecheckt, was du da versendest?
Ok, dann hab ich mich halt falsch ausgedrückt. Entschuldige.
Also bottle nimmt das Formular vom Browser an und legt es in 'bottle.request.forms' und 'bottle.request.POST' ab. Dort sind aber keine Checkboxen enthalten, wenn sie leer sind.
Das ist wohl ein Problem bei HTML, denn in PHP werden leere Checkboxen auch nicht übertragen.
Die erste Checkbox, ist, wenn sie leer ist, auch nicht in 'bottle.request.POST' enthalten. Erst wenn ich das Formular mit der wtforms Klasse erstelle, ist die Checkbox drin und auf 'False' gesetzt, da ich sie ja in der Klasse definiert habe.
Die 2te Checkbox ist aber nicht definiert, da sie ja erst durch JavaScript erstellt wird, als Kopie der ersten mit anderer ID und anderem Namen. Diese füge ich dann nach dem Absenden des Formulars in die Klasse mit setattr() ein. Leider geht das nicht, wenn keine Checkbox in 'bottle.request.POST' enthalten ist.
In der Anwendung ist es möglich beliebig viele Checkboxen zu erstellen. Deshalb muss es auch alles variable bleiben.
Verständlicher?
Also bottle nimmt das Formular vom Browser an und legt es in 'bottle.request.forms' und 'bottle.request.POST' ab. Dort sind aber keine Checkboxen enthalten, wenn sie leer sind.
Das ist wohl ein Problem bei HTML, denn in PHP werden leere Checkboxen auch nicht übertragen.
Die erste Checkbox, ist, wenn sie leer ist, auch nicht in 'bottle.request.POST' enthalten. Erst wenn ich das Formular mit der wtforms Klasse erstelle, ist die Checkbox drin und auf 'False' gesetzt, da ich sie ja in der Klasse definiert habe.
Die 2te Checkbox ist aber nicht definiert, da sie ja erst durch JavaScript erstellt wird, als Kopie der ersten mit anderer ID und anderem Namen. Diese füge ich dann nach dem Absenden des Formulars in die Klasse mit setattr() ein. Leider geht das nicht, wenn keine Checkbox in 'bottle.request.POST' enthalten ist.
In der Anwendung ist es möglich beliebig viele Checkboxen zu erstellen. Deshalb muss es auch alles variable bleiben.
Verständlicher?
Wie kann ich das machen?
Die Checkbox sollten an der richtigen stelle sein, innerhalb des <form>.
#Edit
Habe es jetzt erst einmal mit einem selectField gelöst. Das ging schneller, die Checkbox hat mir einfach zu viel Zeit geraubt. Die Lösung Interessiert mich trotzdem und ich würde sie dann auch gerne wieder einbauen.
Die Checkbox sollten an der richtigen stelle sein, innerhalb des <form>.
#Edit
Habe es jetzt erst einmal mit einem selectField gelöst. Das ging schneller, die Checkbox hat mir einfach zu viel Zeit geraubt. Die Lösung Interessiert mich trotzdem und ich würde sie dann auch gerne wieder einbauen.