form überschreiben

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

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.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

Prima, vielen Dank, das funktioniert!
Antworten