checkbox Voreinstellung

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

Ein schönes neues Jahr wünsche ich euch allen!
... und bräuchte schon wieder mal Hilfe:
Wie sorge ich dafür, dass meine Checkbox hier als Voreinstellung "On" ist:

Code: Alles auswählen

        <form action="/profil/" method="POST">
            {% csrf_token %}         
            <td>Details anzeigen:</td>
            <td><input type="Checkbox"  name="details" value="On"> 
            <input type="submit" value="ändern">
        </form></tr>
Die Beispiele im Internet passen alle nicht und die Django Dokumentation hat mir auch nicht weitergeholfen - oder besser ich habe da keine Hilfe gefunden.
Ich habe es mit value oder initial und True bzw On versucht oder auch mit checked(True) ... wahrscheinlich ist es wieder ganz einfach - ich kann es aber wieder nicht :(
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`<input type="checkbox" name="details" checked / >`

Quelle: https://developer.mozilla.org/en-US/doc ... t/checkbox

Tipp: bei HTML Fragen fährt man in der Regel immer gut a) auf englisch zu Suchen, b) direkt bei MDN. Der von mir verwendete Suchbegriff: "mdn checkbox checked".

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

Die Firma dankt!
Ich habe sogar auf englisch gesucht. Aber auf der Django Seite und StackOverflow. Wenn ich gewusst hätte, dass ich nach "checked" suchen muss und bei MSD, hätte ich es vielleicht gefunden :).
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Vor allem hättest du HTML Dokumentation durchsuchen müssen. Deine Frage hat nichts zu tun mit Python oder Django, usw. Die reichen das HTML nur durch.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ach und dir natürlich auch ein schönes neues Jahr und viel Erfolg weiterhin beim Rechentrainieren! :mrgreen:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Aber auf der Django Seite
Django wäre ja nur relevant, wenn das Formularfeld aus dem Datenbankmodell kommen würde. Wobei AFAIR Django das schon korrekt in ein Forumularfeld rendert, wenn das DB Feld Bool-Typ ist mit `default=True`.

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

Habe ich:

Code: Alles auswählen

class Profil(models.Model):
    user = models.OneToOneField(User, related_name='profil', on_delete=models.CASCADE )
    nachname = models.CharField(max_length=30)
    vorname = models.CharField(max_length=30)
...
    details = models.BooleanField(default = True)
... bin aber nicht schlau genug, dieses zu übertragen :(
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie erstellst du denn das Formular? Der Ausgangspost las sich sehr so, als wäre das manuell erstelltest HTML - da stand nirgendwo, dass das aus einem Modell (über das Forms-Framework?) abgeleitet ist.

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

noisefloor hat geschrieben: Dienstag 9. Januar 2024, 17:56 las sich sehr so, als wäre das manuell erstelltest HTML
Stimmt, erwischt. Es ist ganz einfach so, dass ich mich für meinen Code geschämt habe. Die Schülerinen und Schüler können unter "Profil" ihre Daten einsehen, aber nur zwei Einträge ändern. Da ist es mir nicht gelungen eine form zu erstellen. Aber wenn du schon fragst (und ich habe hier ja eh schon so viel Pfusch gepostet - da kommt es da auch nicht mehr drauf an :lol: ). Also der ganze Code:

Code: Alles auswählen

<p>An deinem Profil kannst du nur den Namen deiner Klasse ändern und außerdem kannst du noch auswählen, ob du auf der Übersichtseite alle Details angezeigt bekommen möchtest - alle anderen Daten kann nur dein Lehrer/deine Lehrerin ändern.</p> 
<table>
    <tr>
        <td>username:</td><td> {{user}}</td></tr>
    <tr>
        <td>Name:</td><td> {{schueler.vorname}} {{schueler.nachname}}</td></tr>
    <tr>
    <tr>
        <form action="/profil/" method="POST">
            {% csrf_token %} 
            <td>{{profil_form.klasse.label}}:</td>
            <td>{{profil_form.klasse}}
            <button type="submit">ändern</button></td>
        </form></tr>
    <tr>
        <td>Jg:</td><td> {{schueler.jg}}</td></tr>
    <tr>
        <td>angemeldet seit:</td><td> {{user.date_joined|date:"d.m.y H:i"}}</td></tr>
    <tr>
        <td>Halbjahr:</td><td> {{schueler.sj}}/{{schueler.hj}}</td></tr>
    <tr>
        <td>Kurs:</td><td> {{schueler.kurs}}</td></tr>
    <tr>
        <td>Stufe:</td><td> {{schueler.stufe}}</td></tr>
    {% if schueler.schule %}
        <tr>
            <td>Schule:</td><td> {{schueler.schule}}</td></tr>
    {%endif%}
        <tr>
            <td>Lerngruppe:</td>
    {% if schueler.gruppe %}
        <td> {{schueler.gruppe.name}}</td></tr>
        <td>bei:</td><td>{{schueler.gruppe.lehrer.profil.vorname}}{%if schueler.gruppe.lehrer.profil.vorname == "Herr"%}n{%endif%} {{schueler.gruppe.lehrer.profil.nachname}}</td></tr>
    {%else%}
        <td>keine</td></td></tr>
    {%endif%}
        <tr>
        <form action="/profil/" method="POST">
            {% csrf_token %}         
            <td>Details anzeigen:</td>
            <td><input type="Checkbox"  name="details" checked /> 
            <input type="submit" value="ändern">
        </form></tr>
        </td>
        
        </tr>
</table>
... und das model:

Code: Alles auswählen

class Profil(models.Model):
    user = models.OneToOneField(User, related_name='profil', on_delete=models.CASCADE )
    nachname = models.CharField(max_length=30)
    vorname = models.CharField(max_length=30)
    
    klasse = models.CharField(max_length=10)
    # diese Felder werden erst ausgefüllt, wenn ein Schüler seine Lerngruppe wählt
    schule = models.ForeignKey(Schule, related_name='schule1', null= True, blank=True, on_delete = models.SET_NULL)
    zweite_schule = models.ForeignKey(Schule, related_name='schule2',null= True, blank=True, on_delete = models.SET_NULL)
    gruppe = models.ForeignKey(Lerngruppe, null= True, blank=True, on_delete = models.SET_NULL, related_name='gruppe')
    
    jg = models.PositiveSmallIntegerField(validators=[MinValueValidator(1), MaxValueValidator(13)])
    kurs= models.CharField(max_length=1, choices=wahl_kurs.choices, default=wahl_kurs.E_KURS,)

    # werden beim Erstellen eingestellt
    stufe = models.PositiveSmallIntegerField(default=5) #, editable=False)
    sj = models.SmallIntegerField(default=0)
    hj = models.SmallIntegerField(default=0)

    katmax = models.IntegerField(default=0)                                 # die Zeilennummer die höchsten gewählten Aufgabenkategorie
    #voreinst = models.IntegerField(default=1)                               # hier können Voreinstellungen gesetzt und abgefragt werden
    voreinst = models.JSONField(blank=True, null=True, default=dict)
    details = models.BooleanField(default = True)

    def __str__(self):
        return f"{self.pk}, {self.vorname} {self.nachname}, {self.klasse}"

    class Meta:
        verbose_name = 'Profil'
        verbose_name_plural = 'Profile'
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

da fehlt immer noch die Form-Klasse... aber so wie es aussieht wie das 2. Formular aktuell gar nicht über eine Form-Klasse erzeugt?

Aber: wenn das

Code: Alles auswählen

<form action="/profil/" method="POST">
            {% csrf_token %}         
            <td>Details anzeigen:</td>
            <td><input type="Checkbox"  name="details" checked /> 
            <input type="submit" value="ändern">
        </form>
wirklich alles für dieses Formular ist möchte ich mal den Sinn hinterfragen. Reicht für "Details anzeigen" nicht einfach ein Link? Entweder will man die sehen - oder nicht. Oder anders gefragt: wenn es ein Formular bliebe und die Checkbox wäre nicht aktiviert, was würde der Code serverseitig anders machen als wenn die Checkbox beim Senden des Formular gecheckt wäre?

Aktuell hat die HTML-Seite zwei Formulare, die bei an die gleiche URL gehen und beide per POST-Request... Absicht oder Copy&Paste Fehler? Serverseitig muss du ja irgendwie zwischen den Formularen unterscheiden.

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

Das mit "Details anzeigen" hat einen vollkommen anderen Grund. Auf der Übersichtsseite wird dem User für jede Kategorie angezeigt, wieviele Aufgaben richtig oder falsch waren, die Fehlerquote, die Bearbeitungszeit, die Klicks auf "Hilfe", "Lösung anzeigen" und "Abbrechen". Außerdem das Datum der letzten Bearbeitung, die durchschnittliche Bearbeitungszeit sowie der erreichet Prozentsatz. Bei einem Tablet passt das prima auf die Seite, beim Smartphone nicht, daher kann der Nutzer wählen ob er nur die 5 wesentlichen Daten angezeigt bekommen möchte. Voreinstellung ist "ja", daher möchte ich den Haken angezeigt bekommen und wenn der User das nicht will, klickt er ihn weg und klickt auf "ändern" das funktioniert.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ok, macht Sinn, Danke für die Erklärung. So wie das Formular aktuell gebaut ist berücksichtigt es aber nicht, wenn der Nutzer den Haken schon mal weg geklickt hat. Das Feld ist ja immer angeklickt, wenn man die Seite aufruft.

Gruß, noisefloor
Antworten