Hilfe für eine komplizierte Tabelle

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

So, ich bin jetzt fast fertig, habe aber noch ein extra kompliziertes Problem:
Die Schülerinnen und Schüler können sich anmelden, die Lehrerinnen und Lehrer auch und die Schülerinnen und Schüler können sich jetzt einer Lerngruppe zuordnen und die entsprechende Lernkraft soll jetzt die Arbeitergebnisse der Gruppenmitglieder einsehen können.
Bei meinem bestehenden Rechentrainer (auf OpenOffice Basis) sieht das etwa so aus:
Bild
Das entsprechende Template habe ich schon angefangen, das sieht bisher so aus:
Bild
Man kann erkennen, dass drei Schüler in der Gruppe angemeldet sind, einer hat noch keine Aufgaben erledigt.
Was jetzt geändert werden müsste ist, dass die Aufgaben jedes Schülers in einer Reihe angezeigt werden und die jeweiligen Aufgaben in der entsprechenden Spalte. Die 10 Aufgaben zum Thema "Ergänzen" von Franz müssten also in die Spalte "Ergänzen", die 20 zu "Subtrahieren" - zum Thema "Addieren" hat Fritz keine Aufgaben gemacht, diese Spalte muss also leer bleiben..
Zur Organisation muss man wissen, dass, jedesmal, wenn ein User eine Themengruppe neu anfängt, eine Instanz im model "Zaehler" erzeugt wird. Franz hat dementsprechend 2 Instanzen, Hans eine und Horst noch gar keine.
Wie seht ihr das, ist das überhaupt zu realisieren? Meine Fähigkeit in komplexeren Zusammenhängen zu denken ist hier wieder mal begrenzt.
Was braucht ihr von meinem Code?
template

Code: Alles auswählen

<body>
<h4>Angemeldet in der Lerngruppe {{gruppe.name}} sind:</h4>
<table>
        {% for s in schueler %}
            <tr><td>{{s.vorname}} {{s.nachname}}, {{s.klasse}}</td><td>{{s.katmax}}</td></tr>
        {% endfor %}
</table>

<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Summe</th>
                {%for kategorie in kategorien %}
                    <th style="transform: rotate(270deg)">{{kategorie.zeile}}: {{kategorie.name}}</th>
                {%endfor%}
        </tr>
    </thead>
    <tbody>
        {% for zahl in zaehler %}
            <tr><td>{{zahl.user.vorname}} {{zahl.user.nachname}}, {{zahl.user.klasse}}</td><td></td><td>{{zahl.kategorie.zeile}}: {{zahl.kategorie.name}}</td><td>{{zahl.richtig|floatformat}}</td></tr>
        {% empty %}
            <strong>Es sind noch keine Schüler angemeldet.</strong>
        {% endfor %}
    </tbody>
</table>
</body>
view

Code: Alles auswählen

def gruppe_uebersicht(req, gruppe_id):
    gruppe = Lerngruppe.objects.get(pk=gruppe_id)
    kategorien = Kategorie.objects.all()
    schueler = Profil.objects.filter(lerngruppe__name=gruppe.name)
    zaehler = Zaehler.objects.filter(user__lerngruppe=gruppe)
    context={'kategorien': kategorien, 'zaehler': zaehler, 'gruppe': gruppe, 'schueler': schueler, 'titel': str(gruppe.name)+", " +str(gruppe.lehrer.profil.vorname)+" " +str(gruppe.lehrer.profil.nachname)}  
    return render(req, 'lehrer/gruppe_uebersicht.html', context)
und die models:

Code: Alles auswählen

class Lerngruppe(models.Model):
    lehrer = models.ForeignKey(User, null=True, on_delete=models.CASCADE, related_name='gruppe')
    name = models.CharField(max_length=15)
...

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
...
    lerngruppe = models.ForeignKey(Lerngruppe, null= True, on_delete = models.SET_NULL, related_name='gruppe')
     katmax = models.IntegerField(default=0)                                 # die Zeilennummer die höchsten gewählten Aufgabenkategorie
...

class Zaehler(models.Model):
    user = models.ForeignKey(Profil, verbose_name='Benutzer', related_name='zaehler', on_delete=models.CASCADE)    
    kategorie = models.ForeignKey(Kategorie, on_delete=models.CASCADE, related_name="zaehler")
...
    richtig = models.DecimalField(max_digits=6, decimal_places=1, default=0)
    bearbeitungszeit = models.FloatField(default=0)    
    falsch = models.PositiveSmallIntegerField(default=0)    
...
Ein weiteres Problem ist, dass ich die Anzahl der richtigen Aufgaben und z.B. die Bearbeitungszeit jedes Users aufsummieren müsste. Da fällt mir nur ein, dass ich das in meinem User"Profil" jeweils zwischenspeichere.
... Und dann muss ich das ganze natürlich noch aufhübschen.
Wenn ihr Spezialisten mir wenigsten einen Hinweis geben könntet, ob das überhaupt zu realiseren ist, wäre ich euch schon dankbar.
So long
Pitwheazle
User
Beiträge: 871
Registriert: Sonntag 19. September 2021, 09:40

OK, ich habe es hinbekommen. Ich habe die Daten in eine geschachtelte Liste gepackt und an das Template übergeben:

Code: Alles auswählen

def gruppe_uebersicht(req, gruppe_id):
    gruppe = Lerngruppe.objects.get(pk=gruppe_id)
    titel = str(gruppe.name)+", " +str(gruppe.lehrer.profil.vorname)+" " +str(gruppe.lehrer.profil.nachname)
    schueler = Profil.objects.filter(lerngruppe__name=gruppe.name)
    max = schueler.aggregate(Max('katmax')).get('katmax__max')
    if max == None:
        max=0
    kategorien = Kategorie.objects.filter(zeile__lt=max+1)
    gruppe_liste = []
    for s in schueler:
        schueler_kat = [0]*(s.katmax)
        zaehler = Zaehler.objects.filter(user=s)
        for z in zaehler:
            schueler_kat[z.kategorie.zeile-1] = int(z.richtig)
        kat_sum = sum(schueler_kat)
        schueler_liste = [s.vorname+" "+s.nachname+" "+s.klasse, kat_sum]
        schueler_liste.extend(schueler_kat)
        gruppe_liste.append(schueler_liste)
    context={'liste':gruppe_liste, 'kategorien': kategorien, 'titel': titel}  
    return render(req, 'lehrer/gruppe_uebersicht.html', context)

Code: Alles auswählen

<body>
<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Summe</th>
                {%for kategorie in kategorien %}
                    <th style="transform: rotate(270deg)">{{kategorie.name}}</th>
                {%endfor%}
        </tr>
    </thead>
    <tbody>
        {% for list in liste %}
            <tr>
                {% for l in list %}
                    <td>{{l}}</td>
                {% endfor %}
            </tr>
        {% empty %}
            <strong>Es sind noch keine Schüler angemeldet.</strong>
        {% endfor %}
    </tbody>
</table>
</body>
Antworten