wurde eine Checkbox angeklickt?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Wie kann ich auslesen, ob eine Checkbox angeklickt wurde:
In meinem Template steht:

Code: Alles auswählen

... 
           <input type="Checkbox"  id="nichtfragen"> 
            <label> Nein, ich möchte <b>nicht</b> das neue Halbjahr anfangen und <b>möchte auch bis zum nächsten {{monat}} nicht mehr danach gefragt werden!</b> </label>
und der aufgerufene view:

Code: Alles auswählen

def neues_halbjahr(req):
    if req.method == 'POST':
        neues_halbjahr = req.POST.get('neu', 'nein') 
        nichtfragen = req.POST.get('nichtfragen') 
        if neues_halbjahr.lower() == 'ja':
            ...
        if nichtfragen == True: 
            user.voreinst *=7
            user.save()
    return redirect('kategorien') 
"if nichtfragen == True:" geht natürlich nicht, aber wie geht es sonst?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn eine Checkbox nicht ausgewählt / angeklickt ist, wird sie _nicht_ mit dem Formular übermittelt. Siehe z.B. Link. Heißt, dass du eigentlich nur prüfen musst, ob der Request überhaupt das Element der Checkbox enthält. Wenn ja weißt du, dass die Box angeklickt ist. Wenn nein war sie nicht angeklickt.

BTW: warum baust du deine Formulare von Hand und nutzt nicht das `forms` Framework von Django? Das macht die Formularvaldidierung und säubern der Daten einfacher. Plus du kannst Formulare aus Modellen quasi automatisch generieren.

Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

noisefloor hat geschrieben: Mittwoch 2. November 2022, 17:54 ... dass du eigentlich nur prüfen musst, ob der Request überhaupt das Element der Checkbox enthält. Wenn ja weißt du, dass die Box angeklickt ist. Wenn nein war sie nicht angeklickt.

BTW: warum baust du deine Formulare von Hand und nutzt nicht das `forms` Framework von Django? Das macht die Formularvaldidierung und säubern der Daten einfacher. Plus du kannst Formulare aus Modellen quasi automatisch generieren.
Zur letzten Frage: Da ich noch sehr unsicher in Django bin, kann ich mit dem 'forms' framework nicht sicher umgehen. Ich dachte mir, zwei Zeilen Code im Template und eine Zeile im View ist für mich am übersichtlichsten. Stück für Stück lerne ich aber auch das noch.
Und zum ersten Hinweis: Wie oben (Django newbie) - bitte hilf mir doch etwas weiter auf die Sprünge - wie überprüfe ich, ob das Element im Request übermittelt wurde?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
wie überprüfe ich, ob das Element im Request übermittelt wurde?
Indem du schaut, ob in request.POST über der Schlüssel "nichtfragen" drin ist. Lass' dir doch per `print(request.POST`) ` ausgeben, einmal wenn du die Checkbox anklickst und einmal, wenn du sie nicht anklickst.
Da ich noch sehr unsicher in Django bin, kann ich mit dem 'forms' framework nicht sicher umgehen.
Ok - aber es macht den Umgang mit Formularen einfacher plus das ist ziemlich ausführlich in Doku erklärt. Je später du da einsteigst, desto mehr Templates und Code in Views musst du um- / neu schreiben. Und falls du Class-Based Views sinnvoll für dein Projekt einsetzen kannst wird es nochmal einfacher.

Gruß, noisefloor
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

noisefloor hat geschrieben: Mittwoch 2. November 2022, 20:26
Indem du schaut, ob in request.POST über der Schlüssel "nichtfragen" drin ist. Lass' dir doch per `print(request.POST`) ` ausgeben, einmal wenn du die Checkbox anklickst und einmal, wenn du sie nicht anklickst.
Ich hatte das tatsächlich schon mal ausprobiert, allerdings nur "print(req)" eingegeben und einmal mit und einmal ohne Anklicken verglichen - das hat mich nicht weitergebracht. Das ergab beide Male "<WSGIRequest: POST '/neues_halbjahr/'>". (ich fürchte, ich bin erst dabei, den Unterschied zwischen "GET" und "POST" zu verstehen :? ). Mit print(req.POST)" bekomme ich, wenn ich mein "nichtfragen" anklicke, "<QueryDict: {'csrfmiddlewaretoken': [...'], 'neu': ['']}> zurück, und keine Rückmeldung ohne diesen Klick. "neu" ist aber das andere label - ich weiß nicht so recht, wie mir das weiterhilft?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Da Deine Checkbox keinen Namen hat, kann der natürlich auch nicht in den POST-Daten auftauchen. Unter welchen Namen denn auch? Die ID ist da irrelevant.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Gut zu wissen!
... Ich habe es ausprobiert:

Code: Alles auswählen

if keinefragen == "on"
funktioniert ... ich bin immer wieder erstaunt, wie einfach das alles geht ... wenn man weiß wie!
Vielen Dank!
Antworten