Seite 1 von 1
wurde eine Checkbox angeklickt?
Verfasst: Mittwoch 2. November 2022, 17:38
von Pitwheazle
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?
Re: wurde eine Checkbox angeklickt?
Verfasst: Mittwoch 2. November 2022, 17:54
von noisefloor
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
Re: wurde eine Checkbox angeklickt?
Verfasst: Mittwoch 2. November 2022, 18:46
von Pitwheazle
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?
Re: wurde eine Checkbox angeklickt?
Verfasst: Mittwoch 2. November 2022, 20:26
von noisefloor
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
Re: wurde eine Checkbox angeklickt?
Verfasst: Mittwoch 2. November 2022, 21:58
von Pitwheazle
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?
Re: wurde eine Checkbox angeklickt?
Verfasst: Mittwoch 2. November 2022, 22:08
von Sirius3
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.
Re: wurde eine Checkbox angeklickt?
Verfasst: Mittwoch 2. November 2022, 22:23
von Pitwheazle
Gut zu wissen!
... Ich habe es ausprobiert:
funktioniert ... ich bin immer wieder erstaunt, wie einfach das alles geht ... wenn man weiß wie!
Vielen Dank!