Seite 1 von 1

form überschreiben

Verfasst: Freitag 21. März 2025, 18:38
von Pitwheazle
Dieses Problem habe ich immer noch nicht gelöst:
Meine Schülerinnen und Schüler können bei der Übersicht ihrer Aufgaben wählen, ob sie nur die erledigten Aufgaben des aktuellen Halbjahres angezeigt bekommen wollen oder alle:

Code: Alles auswählen

class UebersichtHalbjahr(forms.Form):
    auswahl = forms.ChoiceField(choices=[("Halbjahr", 'aktuelles Halbjahr'), ("alle",' alle Aufgaben'),])
... das funktioniert auch soweit. Man sollte aber erkennen können, was gewählt wurde und die Anzeige springt immer zurück auf "aktuelles Halbjahr.
Ich habe versucht die Reihenfolge der Auswahlmöglichkeiten nach Wahl von "alle Aufgaben" zu überschreiben:

Code: Alles auswählen

        protokoll = Protokoll.objects.filter(profil=profil, sj=profil.sj, hj=profil.hj)
        form = UebersichtHalbjahr
        if req.method == 'POST':
            auswahl = form(req.POST)
            if auswahl.is_valid(): 
                auswahl = auswahl.cleaned_data['auswahl']
                if auswahl == "alle":
                    protokoll = Protokoll.objects.filter(profil=profil)
                    form = UebersichtHalbjahr(initial = {"choices": [("alle",'alle Aufgaben'), ("Halbjahr",'aktuelles Halbjahr'), ]}) 
... na ja, es kommt zumindest keine Fehlermeldung, aber es steht immer "aktuelles Halbjahr" im Auswahlfenster.

Re: form überschreiben

Verfasst: Samstag 22. März 2025, 17:29
von noisefloor
Hallo,

es kommt keine Fehlermeldung, weil der Code keinen Fehler hat ;-)

Django rendert das HTML schon in der Reihenfolge, wie es in der Liste im ChoiceField vorkommt. Was aber sein kann ist, dass der Browser die Seite aus seinem Seitenchace zieht, weil er glaubt, dass es die gleiche Seite ist.

Django Forms kennen das `initial` Argument. Damit kannst du Vorgabewerte vorgeben, bei Auswahlfeldern, welches Feld vorausgewählt ist. Wenn das wie hier gewünscht ist, solltest das nutzen. Im HTML wird der Eintrag dann als "selected" markiert. Beispiel:

Code: Alles auswählen

>>> from django import forms
>>> class UebersichtHalbjahr(forms.Form):
...     auswahl = forms.ChoiceField(choices=[("Halbjahr", 'aktuelles Halbjahr'), ("alle", 'alle Aufgaben'),], initial='alle')
...
>>> form = UebersichtHalbjahr()
>>> form.as_p()
'<p>\n    <label for="id_auswahl">Auswahl:</label>\n    <select name="auswahl" id="id_auswahl">\n  <option value="Halbjahr">aktuelles Halbjahr</option>\n\n  <option value="alle" selected>alle Aufgaben</option>\n\n</select>\n    \n    \n      \n    \n  </p>'
>>> class UebersichtHalbjahr(forms.Form):
...     auswahl = forms.ChoiceField(choices=[("Halbjahr", 'aktuelles Halbjahr'), ("alle", 'alle Aufgaben'),], initial='Halbjahr')
...
>>> form = UebersichtHalbjahr()
>>> form.as_p()
'<p>\n    <label for="id_auswahl">Auswahl:</label>\n    <select name="auswahl" id="id_auswahl">\n  <option value="Halbjahr" selected>aktuelles Halbjahr</option>\n\n  <option value="alle">alle Aufgaben</option>\n\n</select>\n    \n    \n      \n    \n  </p>'
>>> form.fields['auswahl'].initial = 'alle'
>>> form.as_p()
'<p>\n    <label for="id_auswahl">Auswahl:</label>\n    <select name="auswahl" id="id_auswahl">\n  <option value="Halbjahr" selected>aktuelles Halbjahr</option>\n\n  <option value="alle">alle Aufgaben</option>\n\n</select>\n    \n    \n      \n    \n  </p>'
>>>
Gruß, noisefloor

Re: form überschreiben

Verfasst: Sonntag 23. März 2025, 14:16
von Pitwheazle
Prima, vielen Dank, das funktioniert!