2 Stimmen

Wie man ein nicht markiertes Kontrollkästchen mit Flask erhält? (Oder etwas!)

Scheinbar haben mehrere Menschen das selbe Problem.

Leider verwenden sie alle PHP, das anscheinend einige seltsame Dinge macht.

Ich habe einige Servercode, der so aussieht:

@app.route("/place", methods=['GET', 'POST'])
def place():
    names = request.form.getlist('name')
    checks = request.form.getlist('checkboxes')
    if request.form.get('Add Element'):
        #return template with another form element and all the data
    #return default template with N copies of the input

Jetzt hier ist das Problem - wenn ich Radio-Schaltflächen für mein Ja/Nein benutze (angekreuzt oder nicht), kann ich getlist nicht verwenden, weil sie alle denselben Namen haben. Alternativ kann ich keine Kontrollkästchen verwenden, weil aus irgendeinem Grund "sie" entschieden haben, dass Kontrollkästchen nicht mit einem "falschen" Wert gesendet werden sollten.

Diese Lösung funktioniert nicht:

Denn dann habe ich ungefähr 1-2x die Anzahl der Elemente, die ich möchte.

Ich möchte kein Javascript verwenden, obwohl ich es leicht könnte - diese Seite wird extrem wenig genutzt (vielleicht 200-300 Seitenansichten pro Monat, höchstens, normalerweise gebündelt gegen Ende des Monats).

Eine mögliche Lösung, die ich hatte, war, ein `JaNein' zu verwenden - aber das scheint etwas umständlich zu sein. Leider fällt mir ohne Javascript keine andere Methode ein, um das zu tun, was ich brauche.

Bin ich auf die select-Option festgelegt?

6voto

Sean Vieira Punkte 147654

Ein nicht aktiviertes Kontrollkästchen wird nicht in eine Antwort serialisiert - wenn Sie es mit einem Fall zu tun haben, in dem Sie mehrere Formabschnitte haben, von denen jeder ein Kontrollkästchen hat (zum Beispiel):

Wiederholender Abschnitt #N
    Textfeld: __________
    Auswahlfeld: -----------^
    Kontrollkästchen: []

Wiederholender Abschnitt #N+1
    usw ...

dann können Sie eine der beiden folgenden Möglichkeiten wählen:

  • Geben Sie jedem Abschnitt ein eindeutiges Präfix oder Suffix - dann können Sie die Existenz dieses bestimmten Werts in der Antwort überprüfen:

    if request.form.get("checkboxField#N", False):
        # Mach etwas, weil das Kästchen aktiviert ist
  • Verwenden Sie ImmutableOrderedMultiDict anstelle von ImmutableMultiDict für Ihren Formularcontainer (indem Sie app.request_class auf eine Klasse mit ihrer parameter_storage_class setzen, die auf einen ImmutableOrderedMultiDict festgelegt ist):

    class OrderedParamContainer(flask.Request):
         parameter_storage_class = ImmutableOrderedMultiDict
    
    # später
    app.request_class = OrderedParamContainer

    Dies ermöglicht es Ihnen, über Schlüssel und Werte des Formulars in der Reihenfolge zu iterieren, in der sie Ihnen vom Browser bereitgestellt wurden (was in allen vorhandenen Fällen die Reihenfolge ist, in der die Formularelemente dem Browser im Quellcode bereitgestellt werden):

     def by_section(form):
         section = {}
         for key, value in enumerate(form):
             if key == "erstesFeldName":
                 yield section
                 section = {}
             section[key] = value
    
         if section: yield section

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X