ich habe eine Frage zur Benutzung von WTForms, genauer wie man dem Formular Daten übergeben kann. Genauer gesagt, geht es um ein modifiziertes SelectMultipleField:
Code: Alles auswählen
class IterableBooleanField(SelectMultipleField):
widget = widgets.ListWidget(prefix_label=False)
option_widget = widgets.CheckboxInput()
Dieses Feld stecke ich in ein Formular:
Code: Alles auswählen
class EditTracker(TokenForm):
enabled = BooleanField(u'Enabled?')
valid_until = DateField(u'Valid Until', validators=[validators.required()])
events = IterableBooleanField(u'Associate events to tracker', coerce=int)
Code: Alles auswählen
class Tracker(database.Base):
__tablename__ = 'tracker'
...
events = relationship('Event', secondary=tracker_events, backref='tracker')
Code: Alles auswählen
form = forms.EditTracker(request.form, tracker)
# alle events aus der Datenbank
form.events.choices = [(e.id, e.name)
for e in Event.query.order_by('event_name')]
...
return render_template('tracker/details.html', tracker=tracker, form=form)

Denn der html-name aller Felder ist ja gleich (events in meinem Fall). Das übergeben der bestehenden Events im selben Format wie für die events.choices funktioniert auch nicht.
Die Dokumentation schreibt dazu:
Leider verstehe ich überhaupt nicht, wie WTForms das bei SelectMultipleFields anwendet. Die Durchsicht des Quellcodes gab mir leider auch keinen Hinweis. So gut sind meine Python-Kenntnisse leider noch nicht, dass ich daraus ersehen könnte, wie das genau gehandhabt wird.**kwargs – If neither formdata or obj contains a value for a field, the form will assign the value of a matching keyword argument to the field, if provided.
Für zweckdienliche Hinweise oder bestehende Beispiele dafür wäre ich sehr dankbar:
Frank
PS:
hier noch das generierte HTML von WTForms
Code: Alles auswählen
<ul id="events">
<li><input type="checkbox" value="5" name="events" id="events-0"> <label for="events-0">another event</label></li>
<li><input type="checkbox" value="1" name="events" id="events-1"> <label for="events-1">Development</label></li>
<li><input type="checkbox" value="4" name="events" id="events-2"> <label for="events-2">foo bar baz</label></li>
<li><input type="checkbox" value="6" name="events" id="events-3"> <label for="events-3">noch eener</label></li>
</ul>