Das mit dem get statt filter war mir auch schon eingefallen, das hatte ich schon geändert und das mit dem fake_user ist noch von dem Gerüst, das whitie mir mal gebastelt hat. Am Anfang war das ja auch noch ein fake_user, das habe ich jetzt auch entfernt und:
Code: Alles auswählen
print(req.user.schueler.nachname)
user = Schueler.objects.get(user = req.user)
print(user.nachname)
gibt mir jetzt tatsächlich auch schon zweimal "Musterschüler" aus. Prima! Mit dem Rest bin ich noch nicht weitergekommen. Mein model "Zaehler":
Code: Alles auswählen
class Zaehler(models.Model):
user = models.ForeignKey(Schueler, verbose_name='schueler', related_name='zaehler', on_delete=models.CASCADE)
kategorie = models.ForeignKey(Kategorie, on_delete=models.CASCADE, related_name="zaehler")
optionen_text=models.CharField(max_length=40, blank=True, default="", verbose_name="Optionen")
typ_anf = models.SmallIntegerField(default=0)
typ_end = models.SmallIntegerField(default=0)
aufgnr = models.PositiveSmallIntegerField(default=0)
richtig = models.PositiveSmallIntegerField(default=0)
Extrapunkte = models.DecimalField(max_digits=5, decimal_places=2, default=0)
richtig_of = models.PositiveSmallIntegerField(default=0)
bearbeitungszeit = models.FloatField(default=0)
falsch = models.PositiveSmallIntegerField(default=0)
loesung = models.PositiveSmallIntegerField(default=0)
abbrechen = models.PositiveSmallIntegerField(default=0)
hilfe = models.PositiveSmallIntegerField(default=0)
def __str__(self):
return f"({self.user}, {self.kategorie}, {self.aufgnr})"
def quote(self):
gesamt = self.richtig + self.falsch
return self.falsch / gesamt *100 if gesamt else 0
class Meta:
verbose_name = 'Zähler'
verbose_name_plural = 'Zähler'
Und meinen Code in "main" habe ich mich bisher nicht getraut komplett hier einzustellen - ich hatte immer Angst, ihr lacht mich aus - aber bitte, auch diesen:
Code: Alles auswählen
def main(req, slug): #hier läuft alles zusammen
print(req.user.schueler.nachname)
user = Schueler.objects.get(user = req.user)
print(user.nachname)
kategorie = get_object_or_404(Kategorie, slug = slug)
kategorie_id = kategorie.id
if req.method == 'POST':
protokoll = Protokoll.objects.get(pk = req.session.get('protokoll_id'))
protokoll.tries += 1
zaehler = Zaehler.objects.get(pk = req.session.get('zaehler_id'))
zaehler.hinweis = ""
if protokoll.value != 0:
form = AufgabeFormZahl(req.POST)
else:
form = AufgabeFormStr(req.POST)
if form.is_valid(): #Aufgabe beantwortet
eingabe = form.cleaned_data['eingabe']
if protokoll.tries == 1:
protokoll.eingabe = protokoll.eingabe + str(eingabe)
elif protokoll.tries == 2:
protokoll.eingabe =f"(1:) {protokoll.eingabe} (2:) {eingabe}"
else:
protokoll.eingabe = f"{protokoll.eingabe} (3:) {eingabe}"
protokoll.bearbeitungszeit = (timezone.now() - protokoll.start).total_seconds()
protokoll.save()
wertung, rueckmeldung = kontrolle(eingabe, protokoll.value, protokoll.loesung, protokoll.id)
if wertung == 1:
#if kontrolle(eingabe, protokoll.value, protokoll.loesung): #Anwort richtig
protokoll.wertung = protokoll.wertung + "r"
protokoll.save()
zaehler.richtig += 1
zaehler.richtig_of +=1
zaehler.aufgnr += 1
zaehler.save()
if zaehler.aufgnr > 10:
if zaehler.optionen_text not in ["", "keine",]: #setzt Stufe hoch wenn eine Option angekreuzt wurde und in der Option "update" = True
max_stufe = 3
for auswahl in Auswahl.objects.filter(
kategorie=kategorie_id,
text__in=zaehler.optionen_text.split(";"),
).all():
if(auswahl.bis_stufe) > user.stufe and auswahl.update:
user.stufe = auswahl.bis_stufe+user.stufe%2
user.save()
zaehler.optionen_text = ""
zaehler.hinweis = ""
zaehler.aufgnr = 0
zaehler.save()
return redirect('kategorien')
quote = int(zaehler.falsch/(zaehler.richtig+zaehler.falsch)*100)
msg = f'<br>richtig: {zaehler.richtig}, falsch: {zaehler.falsch}, Fehlerquote: {quote}%, EoF: {zaehler.richtig_of}/{kategorie.eof}'
messages.info(req, f'Die letzte Aufgabe war richtig! {msg}')
return redirect('main', slug)
else:
titel = protokoll.titel
text = protokoll.text
einheit = protokoll.einheit
anmerkung = protokoll.anmerkung
hilfe = protokoll.hilfe
grafik = protokoll.grafik
if wertung < 0:
messages.info(req, rueckmeldung)
wertung = -1 #Antwort falsch = warten auf neue Eingabe
if wertung == -1:
protokoll.wertung = protokoll.wertung + "f"
protokoll.save()
zaehler.falsch += 1
zaehler.richtig_of = 0
zaehler.save()
quote = int(zaehler.falsch/(zaehler.richtig+zaehler.falsch)*100)
msg = f'<br>richtig: {zaehler.richtig}, falsch: {zaehler.falsch}, Fehlerquote: {quote}%, EoF: {zaehler.richtig_of}/{kategorie.eof}'
messages.info(req, f'Die letzte Aufgabe war leider falsch! Versuche: {protokoll.tries}, {msg}')
if protokoll.tries >= 3: #3 mal falsch
anmerkung = "Leider war deine Eingabe dreimal falsch!<br>Richtig wäre die Lösung: {0} <br>- Frage mal jemanden der dir das erklärt!".format(protokoll.loesung[0])
#messages.info(req, f'letzte Aufgabe: {protokoll.text}, Lösung: {protokoll.loesung}')
#return redirect('kategorien')
else:
messages.info(req, f'{rueckmeldung}') #gibt eine Rückmeldung wenn "indiv" bei Lösung steht
else: #Aufgabenstellung
zaehler, created = Zaehler.objects.get_or_create(user = user, kategorie = kategorie)
form = AufgabeFormZahl()
if not zaehler.optionen_text : #Aufgaben Einstellung
return redirect('optionen', slug)
typ, typ2, titel, text, pro_text, einheit, anmerkung, lsg, hilfe, result, grafik = aufgaben(kategorie.id, jg = user.jg, stufe = user.stufe, typ_anf = zaehler.typ_anf, typ_end = zaehler.typ_end, optionen = "")
if not pro_text:
pro_text = text
if not titel:
titel = kategorie.name
halbjahr = user.halbjahr/10
protokoll = Protokoll.objects.create(
user = user, titel = titel, halbjahr = halbjahr, kategorie = kategorie, text = text, pro_text = pro_text, einheit = einheit, anmerkung = anmerkung, value = result, loesung = lsg, hilfe = hilfe, grafik = grafik, individuell = ""
) #Protokoll wird erstellt
req.session['protokoll_id'] = protokoll.id
req.session['zaehler_id'] = zaehler.id
if protokoll.value != 0:
form = AufgabeFormZahl(req.POST)
else:
form = AufgabeFormStr(req.POST)
if zaehler.aufgnr == 0:
zaehler.aufgnr = 1
zaehler.save()
protokoll.typ = typ
protokoll.typ2 = typ2
protokoll.aufgnr = zaehler.aufgnr
protokoll.save()
if zaehler.hinweis!= "":
messages.info(req, f'{zaehler.hinweis}')
context = dict(kategorie = kategorie, typ = protokoll.typ, titel = titel, aufgnr = zaehler.aufgnr, text = text,
form = form, zaehler_id = zaehler.id, hilfe = hilfe, protokoll_id = protokoll.id, grafik = grafik, message_unten = anmerkung, einheit = einheit)
return render(req, 'core/aufgabe.html', context)
Der letzte noch funktionierende Code ist auch in Github:
https://github.com/pitweazle/rechentrainerweb