Ist Django für mein Projekt geeignet?

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

Auweh, das auch noch! Aber spätestens bei meinen Grafiken komme ich da wohl nicht drumherum. ... und da gibt es ja wenigstens ordentliche Bücher - eins habe ich schon.
Aber doch nochmals mein Plan: Wenn ein Nutzer keine Ahnung hat, wie die angezeigte Aufgabe gelöst werden kann, klickt er oder sie auf „Lösung anzeigen“ und bekommt die Lösung der Aufgabe und auch schon eine neue, in der Hoffnung, dass ihm die Lösung von der letzten weiterhilft. Die letzte Aufgabe und deren Lösung steht im aktuellen Protokoll und in Zaehler wird vermerkt, dass Lösung anzeigen angeklickt wurde und der Eingabeohnefehlerzähler wird auf Null gesetzt.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Pitwheazle hat geschrieben: Dienstag 24. Mai 2022, 12:50 ich übergebe sie hier doch nicht im Context, sondern mit der URL
Kann ich da nicht auch irgendwie die protokoll_id mit übergeben - oder mit dem Button gleich eine Funktion aufrufen anstelle von dem URL Dingens?
Immer schön bedenken, was passiert, wenn mal ein Nutzer die URL per Hand anpasst und andere IDs abfragt, als du von ihm erwarten würdest.. :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.
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Ui, muss ich das auch noch lernen?
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Yup. Denn deine Schüler sind in einem sehr lernfähigen Alter, in dem sie gleichzeitig hochgradig darauf abzielen, so wenig Arbeit wie möglich zu machen, und auch noch Anerkennung dafür ernten. Wenn es eine weg gibt, dein System zu bescheissen, werden sie den ausfindig machen.
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Ja, klar, das muss ich bedenken. Allerdings wird die digitale Kompetenz der Kids m.E. oft überschätzt. Die meisten können schnell tippen und können mit vielen Apps umgehen. Ich habe die Arbeit mit meinem Rechentrainer in OpenOffice ja 15 Jahre lang beobachtet. Zumindest bei uns in der Schule waren da wenige, die sich da reingekniet haben, die meisten Kids haben Tastenkombinationen ausprobiert um ihn auszutricksen aber das jemand sich mit der Struktur oder dem Funktionieren beschäftigt hat, kam sehr selten vor, obwohl der Passwortschutz releativ leicht zu umgehen ist. Dass die Kids Interesse am Code, dem Programmieren oder gezieltem Hacken hatten ebenso. Ich habe immer mal wieder im Wahlpflichtkurs oder auch im Matheunterricht Versuche gestartet, die Schülerinnen und Schüler ans Programmieren heranzuführen und bin dabei auf wenig Interesse gestoßen. Ich fand es schon verwegen, dass sie in Bewerbungsschreiben angegeben haben, dass sie sich gut mit Bürosoftware auskennen würden. Das hätte ich bei keinem auch nur für die Textbearbeitung unterschrieben. Kaum einer kannte Formatvorlagen und bei den Powerpointvorträgen konnte einem oft schwindelig werden.
Aber zurück zum Thema:
Whitie hat geschrieben: Dienstag 24. Mai 2022, 13:10 Bis auf den Prüfen Button würde ich alles andere mit Javascript machen.
Ich hätte jetzt angenommen, dass ich bei meinem "Lösung anzeigen" auch mit Javascript nicht weiterkomme. Javascript beeinflusst doch nur das Frontend, ich müsste aber doch auf die Inhalte von "Protokoll" in der Datenbank zugreifen, da liegt die Lösung. Die kann ich bei vielen Aufgabentypen auch nicht einfach aus der Aufgabenstellung generieren - oder habe ich da wieder was falsch verstanden?
Wenn ich ein View mit "../loesung/zaehler_id/protokoll_id" verbinde, könnte man bei Eingabe von "..loesung/12/37" den entsprechenden Eintrag unter "Zaehler" beeinflussen. Da müsste ich sicherstellen, dass "zaehler.user == protokoll.user" ist und dann mit dem login vergleichen - oder nicht? Mit dem Login habe ich mich ja auch noch nicht abschließend beschäftigt (siehe weiter oben).
Hast du denn einen Alternativvorschlag, wie ich den Klick auf "Lösung anzeigen" auswerten kann, oder ist das deiner Meinung nach wirklich mit Javascript lösbar?
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Ich würde beim Druck auf "Lösung anzeigen" per JS (GET) einen View aufrufen, der 1. alles wichtige im "zaehler" setzt (Lösung wurde angezeigt, usw.) und 2. das Ergebnis als JSON zurückliefert. Das kann man dann beliebig in den (HTML) Code der Seite einfügen. Meiner Meinung nach schützt das auch ausreichend vor Schummeleien. Wenn jemand sich die URL aus dem Quelltext holt um an das Ergebnis zu kommen, wird der Aufruf trotzdem gewertet wie bei "Lösung anzeigen". Somit hätte er/sie nichts gewonnen.

An der Stelle wo du das Ergebnis in den Code setzt, sollte dann auch der "Prüfen" Button deaktiviert werden und evtl. ein "Weiter" Button angezeigt werden. Oder man setzt ein Flag in der Session, das vermerkt, dass die Lösung angezeigt wurde. Oder, oder, oder... Es gibt viele Wege nach Rom ;-)

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

Hui, du bist aber wieder schnell! Das heißt, ich muss mich jetzt mit Javascript und JSON beschäftigen - zwei neue Baustellen. Das schiebe ich vielleicht noch etwas auf und programmiere jetzt mal ein paar weitere Aufgabentypen. Dann muss ich mich noch mit dem Einloggen und dem Userprofil beschäftigen und rausbekommen, wie ich die Tabellenzellen in den HTML Seiten abhängig vom Inhalt färben kann (richtig=grün, falsch=rot usw.), das ist ja wohl auch Javascript. Und was Session bedeutet muss ich dann auch mal rausbekommen.
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Ach, ich bin ganz stolz. Ich habe es jetzt, erstmal vorläufig ohne Javascript, fast hinbekommen. Die Funktion:

Code: Alles auswählen

def loesung(req, zaehler_id):
    zaehler = get_object_or_404(Zaehler, pk = zaehler_id)
    zaehler.loesung +=1
    zaehler.richtig_of = 0 
    zaehler.save()
    protokoll = Protokoll.objects.filter(user = zaehler.user).order_by('-id').first()
    protokoll.eingabe = "Lsg."
    protokoll.save()
    msg=f'{protokoll.text} = {protokoll.value}'
    return redirect('main', zaehler.kategorie)
... speichert unter "msg" die Lösung der letzten Aufgabe, zählt im "Zaehler" den Klick auf Lösung anzeigen, vermerkt es im Protokoll und zeigt die nächste Aufgabe!
Wenn ich jetzt noch auf der Seite mit der neuen Aufgabe unter "letzte Aufgabe" (da wo sonst "Richtig!... " bzw. "Leider falsch!..." angezeigt wird) diese Lösung angezeigt bekäme, und das auch nur, wenn "Lösung anzeigen" angeklickt wurde, wäre ich glücklich.
Und ich verspreche auch, das ich mich dann später mit Javascript, JSON, dem Login und dem Austricksen beschäftige.
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Wenn es nur um den Text in msg geht, kannst du JSON erstmal beiseite lassen. Das könnte man auch so übertragen (return HttpResponse(msg)).
So wie du es jetzt machen möchtest, musst du unterscheiden, welcher Button gedrückt wurde.

Zu den farbigen Tabellen:
Das sollte ganz prima mit dem Template-System gehen. Dafür braucht es kein Javascript.

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

Ich möchte ja nach "Lösung anzeigen" eine neue Aufgaben anzeigen lassen und darüber die Lösung der letzten anzeigen. Nur Lösung anzeichen mit "return HttpResponse(msg)" kann ich ausnahmsweise schon, da wusste ich aber nicht weiter. Ich habe das jetzt folgendermaßen gelöst (vielleicht interessiert es ja jemanden):
Ich habe in der Tabelle "Zaehler" ein Feld "message" ergänzt und das wird, bei Klick auf "Lösung anzeigen" ausgefüllt:

Code: Alles auswählen

def loesung(req, zaehler_id):
    zaehler = get_object_or_404(Zaehler, pk = zaehler_id)
...
    protokoll = Protokoll.objects.filter(user = zaehler.user).order_by('-id').first()
    msg=f'{protokoll.text} = {protokoll.value}'    
    protokoll.eingabe = "Lsg."
    protokoll.save()
    zaehler.message = msg
    zaehler.save()   
    return redirect('main', zaehler.kategorie)
und dann überprüfe ich bei der Erstellung der nächsten Aufgabe ob in dem Feld was drinsteht:

Code: Alles auswählen

   def main( ...
        if zaehler.message!= "":
            messages.info(req, f'Lösung: {zaehler.message}')    
    context = dict(kategorie = kategorie, aufgnr = zaehler.aufgnr, text = text, form = form, zaehler_id = zaehler.id,)
    return render(req, 'core/aufgabe.html', context)
... und lösche den Inhalt von "message" wenn eine Eingabe gemacht wird.
Zu den farbigen fallspezifischen Hervorhebungen habe ich beim ersten Überblick in meinem CSS Buch noch nichts gefunden und Googlesuche brachte nur Beispiele mit JS - da muss ich wohl noch intensiver suchen.
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

So, ich bin wieder zuhause und werde mich jetzt mal wieder mehr in mein Projekt reinknien und habe schon wieder eine Frage:
Meine "Übersichtseite" sieht noch so aus:
Bild hier kann der User sehen, wie er gearbeitet hat.
Der zugehörige HTML Code:

Code: Alles auswählen

        {% for zeile in uebersicht %}
            <tr>
                <th><a class="button" href="{% url 'main' zeile.kategorie.slug %}">{{zeile.kategorie.name|title}}</th> 
                <td>{{zeile.falsch}}</td>
                <td style="background-color:rgba(255,255,0,0.8);">{{zeile.quote|floatformat:"0"}}%</td>
                <td>{{zeile.richtig_of}}</td>
                <td>{{zeile.abbrechen}}</td>
                <td>{{zeile.loesung}}</td>
            </tr>
        {% endfor %}
Im View übergebe ich sowohl die Tabelle mit den Kategorien als auch die Tabelle mit den Werten des Schülers in "Zaehler":

Code: Alles auswählen

def uebersicht(req):
    user = get_fake_user()
    uebersicht = Zaehler.objects.filter(user = user).order_by('kategorie__zeile')
    kategorie = Kategorie.objects.all()
    return render(req, 'core/uebersicht.html', {'kategorie': kategorie, 'uebersicht': uebersicht, 'user':user})
Hier sind aber nur die Kategorien aufgeführt, die er auch bearbeitet hat, nur die stehen in der Tabelle "Zaehler". Jetzt möchte ich aber auch die restlichen Kategorien anzeigen und in dieser Liste, so die Kategorie schon bearbeitet wurde die entsprechenden Werte wie oben.
Es soll also etwa so aussehen.
Bild
Mit dem HTML Code:

Code: Alles auswählen

        {% for zeile in kategorie %}
            <tr>
                <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
                <td>{{zeile.falsch}}</td>
                <td>{{zeile.quote|floatformat:"0"}}%</td>
                <td>{{zeile.richtig_of}}</td>
                <td>{{zeile.abbrechen}}</td>
                <td>{{zeile.loesung}}</td>
            </tr>
        {% endfor %}
nur müssten jetzt halt da, wo der User was gemacht hat, die entsprechenden Werte hin.
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Also ich habe noch etwas rumprobiert:

Code: Alles auswählen

        {% for zeile in kategorie %}
        <tr>
            <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
                {% if eintrag.kategorie == zeile.slug  %}
                    <td>{{eintrag.richtig}}</td>                    
                    <td>{{eintrag.falsch}}</td>
 ...
                {% else %} 
                    <td>-</td>
                    <td>-</td>
...
                {% endif %} 
            {% endfor %}
        </tr>
... jetzt bräuchte ich nur anstelle von
" {% if eintrag.kategorie == zeile.slug %}" einen Befehl wie "wenn es in 'Zaehler' einen Eintrag mit 'zaehler.kategorie = zeile.slug' gibt" oder geht das nicht auf der HTML Seite?

Ich habe es auch mit einer Schleife probiert:

Code: Alles auswählen

        {% for zeile in kategorie %}
        <tr>
            <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
            {% for eintrag in uebersicht %}
                {% if eintrag.kategorie == zeile.slug  %}
In der Schleife kann ich zwar die Werte von "eintrag.kategorie" und "zeile.slug" ausgeben, sie sehen auch gleich aus, werden aber von "if eintrag.kategorie == zeile.slug" nicht erkannt ... und möglicherweise ist diese Schleife auch der Performance nicht zuträglich.

Und was ich auch nicht verstehe: Wenn ich bei "if eintrag.kategorie == zeile.slug" nur ein Gleichheitszeichen schreibe erhalte ich den Fehler

Code: Alles auswählen

Could not parse the remainder: '=' from '='
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Hat sich erledigt.
Mit der Schleife und

Code: Alles auswählen

{% if eintrag.kategorie.id == zeile.id  %}
geht es.
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Da bin ich schon wieder. So ganz klappt es halt doch noch nicht:
Bild
hier der Code:

Code: Alles auswählen

       {% for zeile in kategorie %}
            <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
            {% for eintrag in uebersicht %}
                    {% if eintrag.kategorie.id == zeile.id  %}
                        <td>{{eintrag.richtig}}</td>                    
                        <td>{{eintrag.falsch}}</td>
...
                {% endif %}
            {% endfor %}
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>  
                <td>-</td>
        </tr>
        {% endfor %} 
1. werden, wenn Daten in der inneren Schleife gefunden werden, auch noch " - - - - -" ausgegeben und
2. wird die innere Schleife (wenn mal alles fertig ist) bis zu 35 mal durchlaufen (und die äußere auch 35 mal). Ich möchte sie jeweils stoppen, wenn der entsprechende Eintrag gefunden wurde aber "break" gibt es hier ja nicht.
Ich habe etwas gegoogelt und als beste Lösung die Erstellung eines "custom template tags" gefunden https://pythoncircle.com/post/42/creati ... in-django/
Ich habe mich an die Anleitung gehalten (soweit ich dazu in der Lage war)
Bild
und in meinem Template

Code: Alles auswählen

{% load custom_template_tags %}
ergänzt und die Schleifen so verändert:

Code: Alles auswählen

       {% for zeile in kategorie %}
        {% set weiter = True %}
            <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
            {% for eintrag in uebersicht %}
                {% if weiter %}
                    {% if eintrag.kategorie.id == zeile.id  %}
                        <td>{{eintrag.richtig}}</td>                    
                        <td>{{eintrag.falsch}}</td>
...
                        {% set weiter = False %}
                    {% endif %}
                {% endif %}
            {% endfor %}
            {% if weiter %}
                <td>-</td>
                <td>-</td>
...
            {% endif %}
        </tr>
        {% endfor %} 
und bekomme den Fehler:

Code: Alles auswählen

custom_template_tags' is not a registered tag library
wie bekomme ich diese Library registriert - oder habt ihr eine Idee, wie das einfacher zu lösen ist?
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Es heißt laut deinem Screenshot auch 'custom_template_tag' (ohne das s). Wie sieht denn dein Template-Tag aus? Das wird nicht ganz so trivial zu lösen.
Bei deinem ersten Problem muss ein 'else' rein, damit du nicht Werte und '-' erhälst.

Evtl.:

Code: Alles auswählen

       {% for zeile in kategorie %}
            <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
            {% for eintrag in uebersicht %}
                    {% if eintrag.kategorie.id == zeile.id  %}
                        <td>{{eintrag.richtig}}</td>                    
                        <td>{{eintrag.falsch}}</td>
                       ...
                    {% else %}
                      <td>-</td>
                      <td>-</td>
                      <td>-</td>
                     <td>-</td>
                     <td>-</td>  
                     <td>-</td>

                {% endif %}
            {% endfor %}
                
        </tr>
        {% endfor %} 
Gruß
Whitie
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Whitie hat geschrieben: Sonntag 5. Juni 2022, 07:49 Es heißt laut deinem Screenshot auch 'custom_template_tag' (ohne das s).
Auweh, sowas passiert mir immer wieder :( . Jetzt kommt diese Fehlermeldung nicht mehr, aber

Code: Alles auswählen

{% set weiter = True %}
bringt die Fehlermeldung:

Code: Alles auswählen

Invalid block tag on line 28: 'set', expected 'empty' or 'endfor'. Did you forget to register or load this tag?
Whitie hat geschrieben: Sonntag 5. Juni 2022, 07:49 Wie sieht denn dein Template-Tag aus?
In meinem jugendlichen Leichtsinn dachte ich, das wäre:

Code: Alles auswählen

@register.simple_tag
def weiter():
    return True
Whitie hat geschrieben: Sonntag 5. Juni 2022, 07:49 Bei deinem ersten Problem muss ein 'else' rein, damit du nicht Werte und '-' erhälst.
Nein, das geht nicht. Auf die Idee war ich sogar außnahmsweise selbst gekommen. Die innere Schleife wird, bei Franz Musterschüler, bei jederer Zeile der äußeren Schleife dreimal durchlaufen, bei "eintrag.kategorie.id == zeile.id" werden die Werte ausgegeben und bei "else" jedesmal "- - - - -", das sieht dann so aus:
Bild
und eine andere elif Bedingung fällt mir nicht ein.
Was mir Probleme macht, ist, dass bei einem User im 9. Schuljahr, der alle 35 Aufgabenkategorien bearbeitet hat, die innere Schleife nicht dreimal sondern je 35 mal durchlaufen wird, bis jeweils die entsprechende Kategorie gefunden wird - muss ich mir da nicht Gedanken um die Performance machen? Vielleicht sollte ich in dem jeweiligen "User" Eintrag eine Liste speichern, welche Kategorien schon bearbeitet wurden?
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

So ganz verstehe ich die Tabelle nicht, bzw. die Daten. Brauchst du evtl. sowas hier:

Code: Alles auswählen

{% for zeile in kategorie %}
            <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
            {% for eintrag in uebersicht %}
                    {% if eintrag.kategorie.id == zeile.id  %}
                        <td>{{eintrag.richtig}}</td>                    
                        <td>{{eintrag.falsch}}</td>
...
                {% endif %}
            {% empty %}
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>  
                <td>-</td>
            {% endfor %}
        </tr>
        {% endfor %} 
?

Dein Template-Tag ist ja im Moment nur eine Variable. Dafür bräuchte es keinen Tag. Ich würde wahrscheinlich einen Tag bauen, der die ganze Zeile zurück gibt. Z. B. 'render_table_row(eintrag, zeile).
Dann würde dein Template auf:

Code: Alles auswählen

{% for zeile in kategorie %}
            <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
            {% for eintrag in uebersicht %}
                    {% render_table_row eintrag zeile %}
            {% endfor %}
        </tr>
        {% endfor %} 
zusammen schmelzen. Hätte was.

Im Tag wird es dafür dann aber entsprechend aufwendiger.

Gruß
Whitie

P. S. Über Performance würde ich mir jetzt keine Gedanken machen.
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Whitie hat geschrieben: Sonntag 5. Juni 2022, 11:10 So ganz verstehe ich die Tabelle nicht, bzw. die Daten.
Irgendwie habe ich ja immer noch die Hoffnung, dass es eine ganz einfache Lösung gibt, ich aber da halt noch keinen Zugang zu habe. Ich versuche meine Tabelle nochmal zu erklären. Ich versuche ja meinen existierenden Rechentrainer nachzubauen. Da sieht die Übersichseite so aus:
Bild
Franz ist im 6. Schuljahr und sollte jetzt alle Aufgaben bis einschließlich Quader geübt haben. Bis Runden hat er das, die Felder sind grün, Runden selbst mag er aber nicht, hat er noch nicht gemacht, Geometrie ebenso, das hat er abgebrochen und zu den Aufgaben ab "Einheiten umwandeln" ist er noch nicht gekommen. Alles was erledigt werden muss, färbt sich rot.
Jetzt zu meiner neuen Tabelle. Franz hat bisher nur "Ergänzen", "Addieren" und "Subtrahieren" geübt, dazu wurde jeweils eine Instanz (heißt das so?) in "Zaehler" angelegt, andere gibt es von Franz noch nicht.
Die äußere Schleife "for zeile in kategorie" durchläuft zurzeit noch die neun Einträge in "Kategorie" (das werden mal 35) und die innere Schleife durchläuft jeweils die drei von Franz erledigten in "Zaehler" und wenn die Kategorie übereinstimmt, gibt sie die Daten aus, ansonsten soll "- - - - -" ausgegeben werden. Mit "empty" klappt das bei mir nicht:Bild
Meine Hoffnung war ja, dass ich auf der HTML Seite eine Variable benutzen kann, die ich auf True oder False setzen kann, das hatte ich mir mit dem template-tag erhofft.
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Jetzt wird mir der Aufbau klarer. Da würde ich gar keine innere Schleife benutzen. Ich würde im View die Zaehler Objekte für jede Kategorie die bearbeitet wurde mit in eine passende Variable stecken. Dann ist es direkt verfügbar. Das ändert auch gleich die Performance.

Code: Alles auswählen

def mein_view(request):
    ...
    kategorien = []
    for kategorie in Kategorie.objects.all():
        zaehler = Zaehler.objects.filter(user=user, kategorie=kategorie).first()
        kategorien.append((kategorie, zaehler))
    ...
und dann in deiner Schleife:

Code: Alles auswählen

{% for zeile, zaehler in kategorien %}
            <td><a class="button" href="{% url 'main' zeile.slug %}">{{zeile.name|title}}</th>
                    {% if zaehler %}
                        <td>{{zaehler.richtig}}</td>                    
                        <td>{{zaehler.falsch}}</td>
...
                {% else %}
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>  
                <td>-</td>
               {% endif %}
            {% endfor %}
        </tr>
        {% endfor %} 
Ich weiß nicht ob ich jetzt alles richtig getroffen habe, aber so etwa würde meine Lösung aussehen. Das könnte man trotzdem in einen Template-Tag auslagern, z. B. {% render_table_row zaehler %}. Dort dann prüfen, ob zaehler None ist und entsprechen die Zeile als HTML zurückgeben.
Pitwheazle
User
Beiträge: 861
Registriert: Sonntag 19. September 2021, 09:40

Astrein:
Bild
... wenn ich jetzt noch wüsste, wie das funktioniert...

Code: Alles auswählen

def uebersicht(req):
    user = get_fake_user()
    kategorien = []
    for kategorie in Kategorie.objects.all():
        zaehler = Zaehler.objects.filter(user=user, kategorie=kategorie).first()
        kategorien.append((kategorie, zaehler))
    return render(req, 'core/uebersicht.html', {'kategorien': kategorien, 'zaehler': zaehler, 'user':user})
1. "kategorien = []" ... erstellt eine leere Liste
2. Die Schleife ruft nacheinander alle Elemente in "Kategorie" auf
3. "zaehler = " ... sucht die Einträge in Zaehler in denen der User und die Kategorie übereinstimmt (und findet in diesem Falle drei)
4. "kategorien.append(kategorie,zaehler) ... hängt in der Liste ... was an? Und warum wird die erste Klammer erst hier geschlossen?
5. ... und, wenn ich das richtig sehe, kann ich auch " 'zaehler': zaehler," in "return ..." weglassen

6. und was genau macht "zeile" und "zaehler..." in "{% for zeile, zaehler in kategorien %}"?

Herzlichen Dank, was wäre ich ohne Dich!
Antworten