Auswahl funktioniert nicht so richtig

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

Zunächst wünsche ich Euch allen ein schönes Neues Jahr!

... und dann wollte ich Euch mal wieder um Hilfe bitten (Ich habe in der Zwischenzeit aber auch einiges selbst hinbekommen!).

Also:

Meine User, Schüler(innen) und Lehrer(innen) melden sich an, ihre Daten (Name, Klasse, Jahrgang, Schulort, Schule usw. werden in einer Tabelle "Profil" gespeichert (OneToOne Beziehung zu "User"). Lehrer schicken mir eine E-Mail und werden in die Benutzergruppe "Lehrer" üernommen. Die Lehrerinnen und Lehrer können dann Lerngruppen erstellen und die Schülerinnen und Schüler können diese dann suchen und sich für diese anmelden. Die Kursleiter können dann (in Bälde) die Arbeitsergebnisse ihrer Schülerinnen und Schüler einsehen.

Schulorte und Schulen werden von mir jeweils in einer Tabelle angelegt. Die Schülerinnen und Schüler können jetzt, wie von @whitie vorgeschlagen, sich von Template zu Template klicken und dabei über den Schulort, die Schule und ihere Lehrkraft deren Lerngruppen anzeigen lassen.

Zwei Dinge funktionieren noch nicht.

1. Es werden nach Auswahl der Schule alle angemeldeten Lehrer angezeigt- und nicht nur die an der entsprechenden Schule. Da bekomme ich den Filter für "user.profil.schule=schule_wahl" nicht hin. Nach Auswahl des Schulortes klappt das, es werden nur die Schulen am entsprechenden Ort angezeigt, da hat mir @sirius3 weitergeholfen! Da aber die Schule nicht in "User" sondern in "Profil" steht, bekomme ich das nicht hin.

und 2. Die Schülerinnen und Schüler bekommen jetzt den Usernamen angezeigt und nicht den Namen aus dem Profil. Das geht doch sicher auch anders ... wenn man weiß wie.

view:

Code: Alles auswählen

def schule_wahl(req):
    if req.method == 'POST':
        schule_form = Schule_Form(req.POST)
        if  schule_form.is_valid():
            schule_wahl = schule_form.cleaned_data['schule']
            user = Profil.objects.get(user = req.user)
            user.schule = schule_wahl
            user.save()
            if user.klasse.lower() == "lehrer":
                return render(req, 'wahl_fertig.html', context={'schule': schule_wahl})
            else:
                if schule_wahl == None:
                    return render(req, 'wahl_fertig.html', context={'user': user})
                lehrer_form = Lehrer_Form()
                return render(req, 'schueler/lehrer_wahl.html', context={'lehrer': lehrer_form, 'schule': schule_wahl, 'titel': "Lehrer wählen"})        
    schule_form = Schule_Form()
    return render(req, 'schule_wahl.html', context={'schule': schule_form, 'titel': "Schule wählen"}) 

def lehrer_wahl(req):
    if req.method == 'POST':
        lehrer_form = Lehrer_Form(req.POST)
        if  lehrer_form.is_valid():
            lehrer_wahl = lehrer_form.cleaned_data['lehrer'] 
            if lehrer_wahl == None:
                return render(req, 'wahl_fertig.html', context={'user': req.user})
            gruppe_form = Gruppe_Form(req.POST)
            gruppe_form.fields['gruppe'].queryset=Lerngruppe.objects.filter(lehrer=lehrer_wahl)
            return render(req, 'schueler/gruppe_wahl.html', context={'gruppe':gruppe_form,  'titel': "Lerngruppe wählen"})
    lehrer_form = Lehrer_Form()
    return render(req, 'schueler/lehrer_wahl.html', context={'lehrer':lehrer_form, 'titel': "Lehrer wählen"})

def gruppe_wahl(req):
    if req.method == 'POST':
        schueler=Profil.objects.get(user=req.user)
        gruppe_form = Gruppe_Form(req.POST)
        if  gruppe_form.is_valid():
            gruppe_wahl = gruppe_form.cleaned_data['gruppe']
            if gruppe_wahl == None:
                return render(req, 'wahl_fertig.html', context={'user': req.user})
            schueler.lerngruppe=gruppe_wahl
            schueler.save()
            return render(req, 'schueler/gruppe_fertig.html', context={'gruppe':gruppe_wahl, 'titel': "fertig!"})
    gruppe_form = Schule_Form()
    return render(req, 'schueler/gruppe_wahl.html', context={'gruppe':gruppe_form, 'titel': "Lerngruppe_wählen"}) 
forms:

Code: Alles auswählen

class Schule_Form(forms.Form):
    schule = forms.ModelChoiceField(queryset=Schule.objects.all().order_by('schulname'), widget=forms.Select, required=False)

class Lehrer_Form(forms.Form):
    lehrer = forms.ModelChoiceField(label="Lehrer/in", queryset=User.objects.all().filter(groups__name="Lehrer"), widget=forms.Select, required=False)  

class Gruppe_Form(forms.Form):
    gruppe = forms.ModelChoiceField(label="meine Lerngruppe", queryset=Lerngruppe.objects.all(), widget=forms.Select, required=False)
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=10)    
    class Meta:
        verbose_name_plural = 'Lerngruppen'    
    def __str__(self):
        return f"({self.name}, {self.lehrer})"

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
    ort = models.ForeignKey(Ort, null=True, blank=True, on_delete = models.SET_NULL)
    schule = models.ForeignKey(Schule, null=True, blank=True, on_delete = models.SET_NULL)
    lerngruppe = models.ForeignKey(Lerngruppe, null=True, blank=True, on_delete = models.SET_NULL)
...

schule_wahl.html:

Code: Alles auswählen

<body>
<p>Hier sind die Schulen in {{ort.name}}, die für den Rechentrainer angemeldet sind:</p>
<form action="/schule_wahl/" method="POST">
    {% csrf_token %} 
    {{schule}} 
    <button type="submit">auswählen</button>
</form>
<p>Auch hier gilt: Wenn deine Schule oben nicht dabei ist, muss die Schule neu angelegt werden.</p>
</body>
lehrer_wahl.html:

Code: Alles auswählen

<body>
<p>Das sind die Lehrerinnen und Lehrer, die an der <b>{{schule.schulname}}</b> mit dem Rechentrainer arbeiten:</p>
<form action="/lehrer_wahl/" method="POST">
    {% csrf_token %}
    {{lehrer}}
    <button type="submit">auswählen</button>
</form>
</body>
gruppe_wahl.html:

Code: Alles auswählen

<body>
<p>Jetzt musst du nur noch deine Lerngruppe bei {{lehrer.vorname}} {{lehrer.nachname}} auswählen:
<form action="/gruppe_wahl/" method="POST">
    {% csrf_token %}
    {{gruppe}}
    <button type="submit">auswählen</button>
</form>
</body>
... und dann bin ich nicht so ganz sicher, ob meine Links so in Ordnung sind - oder ob man das ganz anders lösen muss...
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Warum sind denn "User" und "Profil" getrennte Modelle, wenn die eh immer 1:1 verbunden sind? Klingt für mich nach einer unnötigen Trennung, die die Handhabung nur komplizierter macht..?

Dann noch einige ungefragte Anmerkungen zu deinen Formulierungen, die mir ins Auge gefallen sind:

> Das sind die Lehrerinnen und Lehrer, die an der Pitweazle Gymnasium mit dem Rechentrainer arbeiten:

Solche Templates mit grammatischem Geschlecht vorzubelegen kann ganz schnell holperig werden.

> Wenn deine Schule oben nicht dabei ist, muss die Schule neu angelegt werden.

OK, aber was sollen die Nutzer jetzt tun? Es fehlt sowas wie: Schreibe mir dazu eine Nachricht mit folgenden Infos. Oder informiere deinen Lehrer. Oder was eben konkret getan werden kann, um das auszulösen.

> Jetzt musst du nur noch deine Lerngruppe bei {{lehrer.vorname}} {{lehrer.nachname}} auswählen.

Es mag für die Kinder befremdlich sein, ihre Lehrkräfte beim Vornamen zu nennen. Ich würde hier sowas wie Herr/Frau X erwarten. Dazu müsstest du allerdings das Geschlecht des Lehrkörpers speichern. Unklar, ob das heutzutage noch opportun ist.
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.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zum letzten könnte es aber noch praxisrelevant werden wenn es an einer Schule mehr als ein Frau Müller/Herrn Meyer/… gibt. Hatte ich in meiner Schullaufbahn mehrfach, insbesondere an den grösseren Schulen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Kebap hat geschrieben: Donnerstag 5. Januar 2023, 14:31 Warum sind denn "User" und "Profil" getrennte Modelle, wenn die eh immer 1:1 verbunden sind? Klingt für mich nach einer unnötigen Trennung, die die Handhabung nur komplizierter macht..?
Das konnte ich nicht besser. Für User nehme ich das "eingebaute" User-model(mit Passwortverwaltung) und in "Profil" habe ich dann all die Daten die ich sonst noch brauche.
Kebap hat geschrieben: Donnerstag 5. Januar 2023, 14:31 > Das sind die Lehrerinnen und Lehrer, die an der Pitweazle Gymnasium mit dem Rechentrainer arbeiten:<
Solche Templates mit grammatischem Geschlecht vorzubelegen kann ganz schnell holperig werden.
Danke für den Hinweis, das werde ich ändern.
Kebap hat geschrieben: Donnerstag 5. Januar 2023, 14:31 OK, aber was sollen die Nutzer jetzt tun? Es fehlt sowas wie: Schreibe mir dazu eine Nachricht mit folgenden Infos. Oder informiere deinen Lehrer. Oder was eben konkret getan werden kann, um das auszulösen.
Das steht im Template "ort_wahl":

Code: Alles auswählen

<p>Wenn der Schulort oben nicht dabei ist, muss die Schule neu angelegt werden.</p>
{% if user.profil.klasse|lower == "lehrer" %}
    <p>Für einen Lehrerzugang musst du sowieso eine E-Mail an den Rechentrainer schicken.</p>
{% else %}
    <p>Wenn du willst, kannst du ja eine diesbezügliche Mail an den Rechentrainer schicken.</p>
{% endif %}
... und einen entsprechenden Hinweis gibt es auch wenn Schule oder Lehrer(in) nicht angemeldet sind.
Kebap hat geschrieben: Donnerstag 5. Januar 2023, 14:31 > Jetzt musst du nur noch deine Lerngruppe bei {{lehrer.vorname}} {{lehrer.nachname}} auswählen.
Das steht im Hinweis für Lehrer im Registrierungs_Template:

Code: Alles auswählen

      <summary>
        Anmerkungen für Lehrer (bitte beachten):
      </summary>
      <p><b>Bei 'Klasse' bitte 'Lehrer' eintragen.</b></p>
      <p> Bei 'Jg' und 'Kurs' muss eine Auswahl getroffen werden (das kann später geändert werden) - 
      ansonsten können keine Aufgaben erstellt werden!</p>
      <p>(Statt dem Vornamen kann hier natürlich auch Herr oder Frau eingetragen werden.)</p>
      <p>Lehrer, die mir eine Mail mit dem Schulort und dem Namen der Schule schicken, nehme ich in die Gruppe der Lehrer auf.</p>
    </details>
Aber trotzdem Danke für die Hinweise.
Ich hatte übrigens auch schon das Filterproblem mit den Lehrer(inne) gelöst. Leider habe ich jetzt aber meine Änderungen aus Versehen rückgängig gemacht (und sie sind daher auch in meinem Git weg).
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

__blackjack__ hat geschrieben: Donnerstag 5. Januar 2023, 16:28 Zum letzten könnte es aber noch praxisrelevant werden wenn es an einer Schule mehr als ein Frau Müller/Herrn Meyer/… gibt. Hatte ich in meiner Schullaufbahn mehrfach, insbesondere an den grösseren Schulen.
Ich vermute, dass das bei zwei Mathelehrer Rechentrainer-Benutzern an einer Schule eher nicht vorkommt. Ansonsten sind nach meiner Erfahrung die Kolleginnen und Kollegen daran gewöhnt ihren Namen mit Herr X.Müller und Herr Y.Müller anzugeben.
Benutzeravatar
grubenfox
User
Beiträge: 414
Registriert: Freitag 2. Dezember 2022, 15:49

Also dann wird es über kurz oder lang auch zu Herr X. Müller und Herrn Y. Müller kommen.... :? Solche Vermutungen existieren doch nur, um irgendwann von der Realität eingeholt zu werden. :o Aber das passt schon... :mrgreen:

Und noch ein Dankeschön für:
Pitwheazle hat geschrieben: Donnerstag 5. Januar 2023, 17:19 <p>(Statt dem Vornamen kann hier natürlich auch Herr oder Frau eingetragen werden.)</p>
Hatte ich gelesen und dann für mich gedacht: "Mmnmh, ja, stimmt eigentlich...da hat er Recht... kann man ja auch machen..." :o :shock:

Ich bin da echt so konditioniert dass ich ohne nachzudenken in die Webmaske eine Auswahl mit "männlich/weiblich/divers" und eine zweite Auswahl für eine Anrede eingebaut hätte. Nun gut, wenn man mal den Namen mit und mal ohne Anrede benötigt, dann ist eine Trennung hilfreich. Aber ansonsten... Nur sollte dann in der Datenbank das Feld "Vorname" von einen Typ sein bei dem nur der Vorname-String nur in der benötigten Länge gespeichert wird. Wenn der String immer in der max. Länge in der DB gespeichert wird ist es doch irgendwie Platzverschwendung. Bei der heutigen Größe von Massenspeichern aber vermutlich eher irrelevante Verschwendung...
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

grubenfox hat geschrieben: Freitag 6. Januar 2023, 00:20 Hatte ich gelesen und dann für mich gedacht: "Mmnmh, ja, stimmt eigentlich...da hat er Recht... kann man ja auch machen..." :o :shock:
Ich finde die Idee leider nicht so gut. In das Vornamensfeld gehört ein Vorname und in das Anredefeld eine Anrede. Das sollte man nicht mischen und auch nicht By-Design so vorsehen, dass man das zweckentfremden kann. Alles andere führt nach meiner Erfahrung irgendwann zu Problemen. Ich würde den Nachnamen verpflichtend machen und zusätzlich eines der beiden Felder Anrede oder Vorname. Ggf. kann man auch über ein zusätzliches, freies Feld "Bevorzugter Anzeigename" nachdenken. Alles in getrennten Feldern, die man später über eine entsprechende Anzeigelogik in die richtige Form bringen kann.
Benutzeravatar
grubenfox
User
Beiträge: 414
Registriert: Freitag 2. Dezember 2022, 15:49

Gut oder nicht so gut ist jetzt das eine... mir ging es beim Dankeschön eher um den Anstoss mal meine alten Gewohnheiten kurz zu überdenken. Immer ein "haben wir schon immer so gemacht" ist für die Weiterentwicklung eher hinderlich. ;)
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Da der überwiegende Teil meiner Nutzer Schüler zwischen 10 und 16 Jahren sind, wollte ich ihnen kein Feld Herr/Frau/Sonstwas anbieten.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Man könnte vielleicht ♀, ♂, und einen 🌈 anbieten.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten