Flask Macro - Selectbox rendern

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
das ist aber kompliziert. Und das ist tatsächlich die einfachste Art und Weise zum Ergebnis zu kommen?
Auf anderem Wege habe ich das zumindest nicht geschafft. Und die Lösung von Sirius findet man so oder in sehr ähnlicher Form auch in diversen Threads bei SO.
Und kompliziert ist es für doch doch nicht wirklich - Code per C&P übernehmen und gut ist :-)

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

@Blackjack, ich weiss nicht einmal, wozu die __call__ methode gut ist. Meinst du, mit einem Programmier-Profi zu sprechen? :wink:

@Noisefloor: C & P mache ich nur ungern, wenn ich den Code selber nicht verstehe. Was ist SO? Eine andere Alternative wäre einfach die normale Selectbox rendern, zumal das ganze JS-zeug etwas langsam ist.
BlackJack

@meego: Was die `__call__()`-Methode generell macht kann man in der Python-Dokumentation nachlesen und was sie bei WTForms semantisch macht, sollte man dort in der Dokumentation nachlesen können. Die wandelt das `Field` in HTML-Quelltext um. Wenn man also beeinflussen will *wie* das passiert, dann muss man sich die halt anschauen und zum Beispiel kopieren und den eigenen Wünschen anpassen. Alternativ kann man schauen was die so von sich und anderen Objekten verwendet und dort die entsprechenden Methoden überschreiben/verändern.

SO = StackOverflow.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
C & P mache ich nur ungern, wenn ich den Code selber nicht verstehe.
Sagen wir mal so: die meisten von uns - und da schließe ich mich explizit mit ein - werden den Code der Module, die wir einsetzen, nicht verstehen :-)
Bei WTForms z.B. leitest du dir auch eigne Klassen ab und zu wissen, was die Basisklasse macht. Und warum da die Attribute so definiert werden, wie es halt gemacht wird, ist den meisten wahrscheinlich auch nicht klar.

Die Alternative zur Lösung von Sirius wäre noch, dass du den "Choose an Option" Eintrag regulär einfügst und dann auf der Webseite per JavaScript deaktivierst. Wobei das eigene Widget IMHO deutlich eleganter ist.

Und nochmal kurz zu Django: in einer meiner Apps leite ich eine Form aus einem Model für die DB ab. Beim Rendern der Form im Template ist der 1. automatisch `-------`. Diese ist zwar auswählbar, allerdings validiert die Form nicht, wenn man diesen Eintrag wählt.
Ich habe früher ja auch Bottle + WTForms + SQLAlchemy eingesetzt. Was ich selber aber bei Django _wesentlich_ angenehmer finde ist, dass alles unter einer Haube ist und damit sehr gut integriert. Was nicht heißt, dass Django per se besser und alles andere keine Existenzberechtigung.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Gerade mal schnell ausprobiert. Sieht aus wie im Widgetsbeispiel in der Doku, was ist das Problem?:

Code: Alles auswählen

Traceback (most recent call last):
  File "/../forms.py", line 76
    html.append('</select>')
@Blackjack: Danke, werde mir wtforms mal etwas genauer ansehen.

@Noisy: Ein '-------' finde ich aber jetzt aber etwas schräg (wenn man das nicht ändern kann). Ja, ich habe mir auch schon die Sinnfrage gestellt, weil man ja letztlich doch alle Erweiterungen benötigt (Migrationen, Admin, wtforms, alchemy, babel). Allerdings haben die selbst im Djangoforum gesagt, SQLalchemy würden sie lieber verwenden und irgendwie ist's bis jetzt einfach näher an der Pythonsyntax, also gerade als Newbie vielleicht besser zum lernen.
BlackJack

Das Problem mit der Problembeschreibung ist, dass das nicht der gesamte Traceback ist.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hier:

Code: Alles auswählen

Traceback (most recent call last):
  File "./run.py", line 4, in <module>
    import j.models
  File "/home/nuc/Dropbox/J/j/__init__.py", line 5, in <module>
    from j.views import views
  File "/home/nuc/Dropbox/J/j/views.py", line 2, in <module>
    from j.forms import PlaceAdvertisement
  File "/home/nuc/Dropbox/J/j/forms.py", line 76
    html.append('</select>')
       ^
SyntaxError: invalid syntax
Zuletzt geändert von meego am Donnerstag 24. Dezember 2015, 12:27, insgesamt 1-mal geändert.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das ist doch nicht alles, oder? Da fehlt noch die Angabe, welcher Error aufgetreten ist...

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Korrigiert. :wink:
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du hast in deiner Zeile 75 einen Fehler - da musst du dann mal Suchen (z.B. fehlende schließende Anführungszeichen, fehlend schließende Klammer etc.)

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Gefunden. Funktioniert jetzt alles. Bis auf die Selectbox. Die Einträge sind leer. :D

Code: Alles auswählen

class SelectWithChooseOption(widgets.Select):
    def __call__(self, field, **kwargs):
        kwargs.setdefault('id', field.id)
        if self.multiple:
            kwargs['multiple'] = True
        html = ['<select %s>' % widgets.html_params(name=field.name, **kwargs)]
        any_selected = False
        for val, label, selected in field.iter_choices():
            html.append(self.render_option(val, label, selected))
            any_selected |= selected
        html.insert(1, self.render_option('', 'Choose your option', selected=not any_selected, disabled=True))
        html.append('</select>')
        return widgets.HTMLString(''.join(html))
 
class QuerySelectFieldWithChooseOption(QuerySelectField):
    widget = SelectWithChooseOption()
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Der Fehler lag auf meiner Seite, ich hatte noch das alte Macro verlinkt. :mrgreen:
Antworten