Ist Django für mein Projekt geeignet?

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

Hallo Leute
Ich habe jetzt brav auch noch die nächsten Seiten im Django Tutorium abgearbeitet und mich an den "forms"versucht und bräuchte wiedermal eure Hilfe (Ich merke , dass mein Gehirn nicht mehr geschmeidig genug ist um die Feinheiten im englischen Howto zu verstehen).
Ich bin ganz stolz, ich habe zu meinen Kategorien jetzt noch ein model "auswahl" erstellt und da für jede Kategorie Auswahlmöglichkeiten erstellt. Der Anfang funktioniert auch:
Bild
Der zugehörige Ausschnitt aus dem Template sieht so aus:

Code: Alles auswählen

<form action="{% url 'wahl' kategorie.id %}" method="post">
    {% csrf_token %}
    <h2>{{ kategorie.name }}</h2>
<ul>
    <fieldset>
        <legend><h3>wähle aus:</h3></legend>
        {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
        {% for auswahl in kategorie.auswahl_set.all %}
            <input type="checkbox" name="auswahl" id="auswahl" value="{{ auswahl.id }}">
            <label>{{ auswahl.text }}</label><br>
        {% endfor %}
    </fieldset>
    <h3><input type="submit" value="weiter"></h3>
    </form>
</ul>
{% endblock %}
Wenn ich auf "weiter" klicke wird jetzt zumindest schon ein view aufgerufen:

Code: Alles auswählen

def wahl(request, kategorie_id):
    return HttpResponse(kategorie_id)
    #kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    #selected_choice = kategorie.auswahl_set.get(pk=request.POST['wahl'])
... und gibt auch immerhin schon die ID der Kategorie zurück.
Im Tutorium wurde beschrieben, wie man auswertet, wie oft auf einen Radio-Button geklickt wurde. Ich muss nicht zählen und muss bei späteren Kategorien auch Mehrfachauswahlen zulassen. Ich bekomme aber nicht raus, wie ich diese Auswahl(en) auf der Seite auswerte.
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Also erstens erzeugst du hier input Felder, die die selbe id und den selben Namen haben. Das ist nicht zulässig. So kannst du auch nicht mehr unterscheiden, was ausgewählt wurde. Zweitens sehe ich nicht, wo du hier forms benutzt.
Du müsstest ein forms.Form Objekt erzeugen, dass deine Auswahl wiederspiegelt. Anbieten würde sich hier ein MultipleSelectField mit einem CheckboxSelectMultiple Widget. Da die Kategorie nicht fest ist, muss man etwas tiefer in die "forms" einsteigen, um die Einträge (choices) für das Feld zu erzeugen. Das überlasse ich mal dir ;-)

Viele Grüße
Whitie
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Na, dann weiß ich ja zumindest wo ich suchen muss.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Whitie hat geschrieben: Dienstag 15. März 2022, 07:56 Du müsstest ein forms.Form Objekt erzeugen, das deine Auswahl wiederspiegelt. Anbieten würde sich hier ein MultipleSelectField mit einem CheckboxSelectMultiple Widget. Da die Kategorie nicht fest ist, muss man etwas tiefer in die "forms" einsteigen, um die Einträge (choices) für das Feld zu erzeugen. Das überlasse ich mal dir ;-)
Hallo Whitie (oder wer auch immer mir helfen mag)
Ich habe mich jetzt fleißig 2 Wochen lang mit "forms" beschäftigt und auch das mit dem "CheckboxSelectMultiple Widget" gefunden. Ich könnte jetzt auch eine Pizzadienstbestellseite gestalten:
Bild
(Scherz)

... ich komme aber mit meinem Problem nicht weiter und wollte euch bitten, mir doch mal wieder auf die Sprünge zu helfen:
Zur Erinnerung: Je nach Kategorie (Ergänzen, Addieren, Subtrahieren...) haben die Kids, je nach Klasse und Stufe verschiedene Auswahlmöglichkeiten (mit/ohne Kommazahlen oder bei Umrechnung von Größen nur Längen oder auch Flächen bzw Volumen...). Mal gibt es eine Möglichkeit, mal mehrere, mal gar keine.
Nochmal ein Ausschnitt aus dem odel für die Kategorien:

Code: Alles auswählen

class Kategorie(models.Model):
    zeile = models.PositiveSmallIntegerField(default=0)             # entspricht der Aufgabengruppe (1 bis 35)
    name = models.CharField(max_length=20)
    ...
und im model "Auswahl" sind die Auswahlmöglichkeiten gespeichert:

Code: Alles auswählen

class Auswahl(models.Model):
    kategorie = models.ForeignKey(Kategorie, on_delete=models.CASCADE)
    text = models.CharField(max_length=80, verbose_name="Text")
    bis_stufe = models.IntegerField(default=0, verbose_name="bis Stufe:")
    bis_jg = models.IntegerField(default=0, verbose_name="bis Jahrgang:")
Bei meinem Pizzabeispiel war es einfach, hier gibt es immer nur die Möglichkeit "klein", "mittel" oder "groß". In meinem Beispiel muss ich die Einträge in meinem model filtern, die zur Kategorie "Addieren" (oder auch "Zeile=1" gehören (und später auch noch z.B. "start_jg<=7)) gehören. Für euch ist das sicher ein Leichtes (für mich hoffentlich auch irgendwann einmal) - ich bekomme es nicht hin.

Versucht habe ich z.B. "wahl=Auswahl.objects.filter(kategorie.zeile=2)"
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Dein Versuch nach nicht ganz die richtige Syntax, siehe hier.
Probier mal

Code: Alles auswählen

wahl=Auswahl.objects.filter(kategorie__zeile=2)
Viele Grüße
Whitie
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Auweh! Ob ich es schaffe, mir diese Unterschiede irgendwann zu merken?
Was meint ihr, liegt das am Alter? Ich würde ja gerne mal eine Umfrage starten, welche Altersstruktur die Könner hier abdecken.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Also so ein bisschen klappt das ja schon:
Das ist mein view:

Code: Alles auswählen

def auswahl(req, kategorie_id):
    form=AuswahlForm()
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    optionen=kategorie.auswahl_set.all().count()
    print(optionen)
    if optionen>0:
        user=get_fake_user()
        print(kategorie.name)
        return render(req, 'core/auswahl.html', {'kategorie': kategorie, 'auswahl_form':form})
    else:
        return HttpResponse("keine Optionen")
bei "print(optionen)" wird auch wunderbar die Anzahl der Optionen je nach Kategorie zurückgegeben (Bei "Addieren" 3 und bei "Subtrahieren" 1 ...).

Das ist meine form:

Code: Alles auswählen

class AuswahlForm(forms.Form):
    optionen=forms.ModelChoiceField(queryset=Kategorie.objects, widget=forms.RadioSelect)
    #optionen=forms.ModelChoiceField(queryset=Kategorie.objects, widget=forms.CheckboxSelectMultiple)
Aber die gibt natürlich die ganzen Kategorien zurück:

Bild

... und nicht die Optionen der Kategorie. Das sollte ja eigentlich so aussehen:

Bild

Ich muss also in "AuswahlForm" "queryset=Kategorie.objects" irgendwie austauschen zu "kategorie.auswahl..." oder so???
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Du must die __init__ Methode deines Formulars anpassen.

Ungetestet:

Code: Alles auswählen

class AuswahlForm(forms.Form):
    optionen=forms.ModelChoiceField(queryset=Kategorie.objects.none(), widget=forms.RadioSelect)
    
    def __init__(self, *args, **kwargs):
        kategorie = kwargs.pop('kategorie')
        super().__init__(*args, **kwargs)
        self.fields['optionen'].queryset = kategorie.auswahl_set.all()
Und im View dann:

Code: Alles auswählen

def auswahl(req, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    form = AuswahlForm(kategorie=kategorie)
    ...
Viele Grüße
Whitie
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Du bist der Größte!
Bild

... wenn ich auch (noch nicht) verstanden habe wie das funktioniert.

Aber jetzt muss ich mich erstmal um die Auswertung kümmern und auch um die "CheckboxSelectMultiple" - das wird sicher auch wieder ein Problem.

Danke!!
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Du gibst deinem Formular erstmal ein leeres Queryset mit, da die Optionen erst zur Laufzeit ermittelt werden können (besser wäre hier Auswahl.objects.none(), das dieses Model später auch zur Wahl steht), 'queryset' aber übergeben werden muss. Dann überschreibst du die __init__ Methode des Formulars und ergänzt dort ein Keyword-Argument (kategorie). Dieses ziehst du aus den Keyword-Argumenten (pop) raus, bevor du die __init__ Methode der Elternklasse aufrufst, damit Django nicht durcheinander kommt. Dann setzt du für dein Feld das passende Queryset.

Das ist ein Fall, der nicht selten ist. Man könnte das ganze auch mit Javascript machen, verliert dann aber teilweise die Formularauswertung durch Django.

"CheckboxSelectMultiple" gibt dir eine Liste der ausgewählten Optionen zurück.

Viele Grüße
Whitie
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Vielleicht hätte ich zuesrt C++ oder Java lernen müssen!
Also:
"kategorie = kwargs.pop('kategorie')" ist das leere queryset und
"kategorie.auswahl_set.all()" ersetzt es dann? Und das wiederum kommt von da:

Code: Alles auswählen

class Auswahl(models.Model):
    kategorie = models.ForeignKey(Kategorie, on_delete=models.CASCADE)
Stimmt das soweit?

Aber ich komme schon wieder nicht weiter - ich gebe aber mein bestes irgenwann auch wieder mal ein Stück alleine weiterzukommen!

Ich habe im aufgerufenen Template den Code:

Code: Alles auswählen

<form action="{% url 'wahl' kategorie.id%}" method="Post">
    {% csrf_token %}
    {{auswahl_form}}
    <input type="submit" value="weiter">
</form>
und der aufgerufene view hat dann den Code:

Code: Alles auswählen

def wahl(req, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    form = AuswahlForm(req.POST)
    return HttpResponse(form.cleaned_data['optionen'])
... der, wie du sicher mit einem Blick feststellst, nicht funktioniert. Ich muss ja einerseits die id meiner Kategorie weitergeben (das geht) und dann die gewählte Option auslesen - aber wie?

Das Formular habe ich von dir übernommen.
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Pitwheazle hat geschrieben: Vielleicht hätte ich zuesrt C++ oder Java lernen müssen!
Also:
"kategorie = kwargs.pop('kategorie')" ist das leere queryset und
"kategorie.auswahl_set.all()" ersetzt es dann? Und das wiederum kommt von da:

Code: Alles auswählen

class Auswahl(models.Model):
    kategorie = models.ForeignKey(Kategorie, on_delete=models.CASCADE)
Stimmt das soweit?
Das stimmt nur fast. Mit kwargs.pop('kategorie') holst du die im View übergebene Kategorie aus den Keyword-Argumenten. Dann benutzt du diese Kategorie, um die Optionen dieser Kategorie als Queryset zu setzen.
Pitwheazle hat geschrieben:

Code: Alles auswählen

def wahl(req, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    form = AuswahlForm(req.POST)
    return HttpResponse(form.cleaned_data['optionen'])
... der, wie du sicher mit einem Blick feststellst, nicht funktioniert. Ich muss ja einerseits die id meiner Kategorie weitergeben (das geht) und dann die gewählte Option auslesen - aber wie?
Du hättest ruhig noch die Fehlermeldung dazu zeigen können, dann wäre es dir bestimmt selbst aufgefallen (KeyError: 'kategorie') ;-) Unser Formular benötigt ja jetzt ein (von uns angefordertes) Keyword-Argument namens kategorie. Also:

Code: Alles auswählen

def wahl(req, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    form = AuswahlForm(req.POST, kategorie=kategorie)
    return HttpResponse(form.cleaned_data['optionen'])
Viele Grüße
Whitie
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Whitie hat geschrieben: Mittwoch 30. März 2022, 17:02 Das stimmt nur fast. Mit kwargs.pop('kategorie') holst du die im View übergebene Kategorie aus den Keyword-Argumenten. Dann benutzt du diese Kategorie, um die Optionen dieser Kategorie als Queryset zu setzen.
Ich fürchte, dass ich möglicherweise auch in einem Jahr noch nicht den grundlegenden Durchblick erreiche.

Also "kategorie=kategorie" ist alles was fehlt? Ich bin immer wieder beeindruckt, wie einfach das alles aussieht wenn man weiß wie es geht!
Natürlich war die Fehlermelung "kategorie" allerdings fällt es mir schwer, aus der langen Fehlermeldung die Essenz zu finden - das wird aber besser.

Jetzt kommt als Fehlermeldung "'AuswahlForm' object has no attribute 'cleaned_data'" - ganz klappt es leider noch nicht.

Ich hoffe du schaffst es noch eine Zeitlang meine blöden Anfängerfragen zu beantworten. Ich gebe mir ja auch Mühe im Tutorium von Django zu suchen. Hier sind die Möglichkeiten aber sehr umfangreich und es fällt mir schwer, die richtigen Hinweise zu finden. Mit reinem Python Code würde ich mir mehr zutrauen, da habe ich Bücher in denen ich mich zurechtfinde aber Django überfordert mich (noch).

Vielen Dank für deine geduldige Hilfe

PS. Ich hatte auch gedacht, dass die Kategorie schon mit "wahl(req, kategorie_id)" übergeben wurde, denn

Code: Alles auswählen

def wahl(req, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    return HttpResponse(kategorie.name)
... gibt ja richtig "Addieren" zurück
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Pitwheazle hat geschrieben: Ich fürchte, dass ich möglicherweise auch in einem Jahr noch nicht den grundlegenden Durchblick erreiche.
Je nach aufgewendeter Zeit könnte das durchaus sein. Das sollte dich aber nicht erschrecken oder abhalten.
Pitwheazle hat geschrieben: Also "kategorie=kategorie" ist alles was fehlt? Ich bin immer wieder beeindruckt, wie einfach das alles aussieht wenn man weiß wie es geht!
Natürlich war die Fehlermelung "kategorie" allerdings fällt es mir schwer, aus der langen Fehlermeldung die Essenz zu finden - das wird aber besser.
Du musst deine Kategorie als Keyword-Argument übergeben. So haben wir es in der __init__ Methode des Formulars hinterlegt. Das muss man auch beim Auswerten des Formulars machen, sonst kann Django das Feld nicht validieren.
Pitwheazle hat geschrieben: Jetzt kommt als Fehlermeldung "'AuswahlForm' object has no attribute 'cleaned_data'" - ganz klappt es leider noch nicht.
Der Fehler ist einfach zu beheben: Du hast vergessen auf dem Formular die is_valid Methode aufzurufen (form.is_valid()). Erst wenn diese aufgerufen wird, validiert Django das Formular und "befüllt" form.errors und form.cleaned_data (das ist sehr einfach formuliert, im Hintergrund wird form.full_clean() aufgerufen und dort wird validiert ;-) ).
Pitwheazle hat geschrieben: Ich hoffe du schaffst es noch eine Zeitlang meine blöden Anfängerfragen zu beantworten. Ich gebe mir ja auch Mühe im Tutorium von Django zu suchen. Hier sind die Möglichkeiten aber sehr umfangreich und es fällt mir schwer, die richtigen Hinweise zu finden. Mit reinem Python Code würde ich mir mehr zutrauen, da habe ich Bücher in denen ich mich zurechtfinde aber Django überfordert mich (noch).
Das ging mir am Anfang ähnlich. Freut mich, wenn ich etwas Licht ins Dunkel bringen kann.
Pitwheazle hat geschrieben: PS. Ich hatte auch gedacht, dass die Kategorie schon mit "wahl(req, kategorie_id)" übergeben wurde, denn

Code: Alles auswählen

def wahl(req, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    return HttpResponse(kategorie.name)
... gibt ja richtig "Addieren" zurück
Dort kommt ja nur die ID der Kategorie (eine Zahl) in den View. Dann holst du das Model mit der ID aus der DB. Die Kategorie ist dann aber nicht auf magische Weise in deinem Formular bekannt, ergo übergibst du sie anschließend.

Viele Grüße
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Whitie hat geschrieben: Donnerstag 31. März 2022, 07:00
Pitwheazle hat geschrieben: Ich fürchte, dass ich möglicherweise auch in einem Jahr noch nicht den grundlegenden Durchblick erreiche.
Je nach aufgewendeter Zeit könnte das durchaus sein. Das sollte dich aber nicht erschrecken oder abhalten.
Pitwheazle hat geschrieben: Ich hoffe du schaffst es noch eine Zeitlang meine blöden Anfängerfragen zu beantworten. Ich gebe mir ja auch Mühe im Tutorium von Django zu suchen. Hier sind die Möglichkeiten aber sehr umfangreich und es fällt mir schwer, die richtigen Hinweise zu finden. Mit reinem Python Code würde ich mir mehr zutrauen, da habe ich Bücher in denen ich mich zurechtfinde aber Django überfordert mich (noch).
Das ging mir am Anfang ähnlich. Freut mich, wenn ich etwas Licht ins Dunkel bringen kann.
Vielen Dank für diese Hinweise. Diese tun mir sehr gut. Ich hatte schon mehrmals überlegt hinzuwerfen und lieber meine Briefmarkensammlung zu sortieren oder endlich meine Socken zu stopfen. Ich finde es immer peinlich, meine Fargen hier zu posten und dafür Einzelunterricht zu bekommen. Ich vermute, dass die meisten Leser die Augen verdrehen.
Whitie hat geschrieben: Donnerstag 31. März 2022, 07:00
Der Fehler ist einfach zu beheben: Du hast vergessen auf dem Formular die is_valid Methode aufzurufen (form.is_valid()). Erst wenn diese aufgerufen wird, validiert Django das Formular und "befüllt" form.errors und form.cleaned_data (das ist sehr einfach formuliert, im Hintergrund wird form.full_clean() aufgerufen und dort wird validiert ;-) ).
Wenn man weiß wie es geht sieht es immer wieder ganz einfach aus!

... aber das nächste Problem:
Mit "widget=forms.RadioSelect" geht das schon wunderbar - du hattest gesagt, mit "widget=forms.CheckboxSelectMultiple)" wird eine Liste zurückgegeben. Aber meine Hoffung, dass jetzt einfach eine Liste zurückgegeben wird, war wohl verfrüht. "ValueError: The view core.views.wahl didn't return an HttpResponse object. It returned None instead."
... Wahrscheinlich geht ads auch wieder ganz einfach - man muss nur...?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nur mal so nebenbei als kleine Motivation: du schlaegst dich wacker. Wird schon!
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Ich kann dem Kontext jetzt nicht mehr ganz folgen.
"wahl" ist der View, der das Formular auswertet?

Die Fehlermeldung hat nichts mit dem Formular zu tun. Dein View gibt None zurück statt eines HttpResponse Objekts.

Probier mal folgenden View und poste die Konsolenausgabe (nicht den Browserinhalt):

Code: Alles auswählen

from django.views.decorators.http import require_POST

@require_POST
def wahl(req, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    form = AuswahlForm(req.POST, kategorie=kategorie)
    if form.is_valid():
        print('Formulardaten:')
        print(form.cleaned_data)
    else:
        print('Fehler:')
        print(form.errors)
    return HttpResponse('ok')
Den import solltest du natürlich nach oben ins Modul schreiben. Der sorgt dafür, das wirklich nur POST Requests angenommen werden.

Viele Grüße
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Pitwheazle hat geschrieben: Donnerstag 31. März 2022, 09:36 Ich finde es immer peinlich, meine Fargen hier zu posten und dafür Einzelunterricht zu bekommen. Ich vermute, dass die meisten Leser die Augen verdrehen.
Falsch vermutet, zumindest ich lese hier interessiert mit. Du hast dir aber auch kein leichtes (oder kleines) Projekt für den Einstieg gewählt.
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.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Das motiviert mich ungemein:
__deets__ hat geschrieben: Donnerstag 31. März 2022, 10:15 Nur mal so nebenbei als kleine Motivation: du schlaegst dich wacker. Wird schon!
Kebap hat geschrieben: Donnerstag 31. März 2022, 10:51
Pitwheazle hat geschrieben: Donnerstag 31. März 2022, 09:36 Ich finde es immer peinlich, meine Frsgen hier zu posten und dafür Einzelunterricht zu bekommen. Ich vermute, dass die meisten Leser die Augen verdrehen.
Falsch vermutet, zumindest ich lese hier interessiert mit. Du hast dir aber auch kein leichtes (oder kleines) Projekt für den Einstieg gewählt.
Bild
Bei einer Auswahlmöglichkeit (Kategorie1) und keiner Wahl kommt:

Code: Alles auswählen

[31/Mar/2022 12:11:57] "GET /auswahl/1 HTTP/1.1" 200 1195
Fehler:
<ul class="errorlist"><li>optionen<ul class="errorlist"><li>Dieses Feld ist zwingend erforderlich.</li></ul></li></ul>
Bild
Bei drei Auswahlmöglichkeiten (Kategorie2) und zwei Kreuzchen kommt:

Code: Alles auswählen

[31/Mar/2022 12:12:29] "GET /auswahl/2 HTTP/1.1" 200 1470
Fehler:
<ul class="errorlist"><li>optionen<ul class="errorlist"><li>Bitte eine gültige Auswahl treffen. Dies ist keine gültige Auswahl.</li></ul></li></ul>

Code: Alles auswählen

class AuswahlForm(forms.Form):
    optionen=forms.ModelChoiceField(queryset=Kategorie.objects, widget=forms.CheckboxSelectMultiple)
    
    def __init__(self, *args, **kwargs):
        kategorie = kwargs.pop('kategorie')
        super().__init__(*args, **kwargs)
        self.fields['optionen'].queryset = kategorie.auswahl_set.all()
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Also wird beide male der Fehlerzweig ausgeführt. Ich meine du musst im Form noch required=False setzen, also:

Code: Alles auswählen

optionen = forms.ModelChoiceField(queryset=Kategorie.objects, widget=forms.CheckboxSelectMultiple, required=False)
Sonst wird erwartet, dass alle Checkboxen aktiviert werden. Sorry, sowas habe ich lange nicht benutzt ;-)

Viele Grüße
Antworten