Ist Django für mein Projekt geeignet?
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
Vielen Dank schonmal!
Zu 1. In meinem bestehenden Rechentrainer habe ich, wie gesagt, vorgegeben, wie weit die Kids in einem bestimmten Schuljahr und einer bestimmten Schulwoche gekommen sein müssten. Alle diese Aufgabentypen, von denen sie noch nicht mindestens 10 richtig gelöst haben, färben sich rot. Außerdem erstelle ich mit dieser Vorgabe zurzeit auch automatisch eine Note. (Das mit der Note werde ich wahrscheinlich weder hinbekommen und auch nicht angehen). Die Kids sollen aber erkennen können, was sie eigentlich alles gemacht haben müssen. Wie du schon vorschlägst, sollte ich vielleicht nicht alles gleich einbauen, habe aber schon gemerkt, dass, wenn ich die Daten mit Inhalten fülle und dann Felder in den Models einfüge, es Schwierigkeiten gibt. Also lasse ich die Idee, dass andere Schulen andere Vorgaben machen können erst mal weg, werde es aber für die einzelnen Kategorien mit meinen Vorgaben füllen.
Zu 3, 4 und 5. Wie ich geschrieben habe, war die Überlegung, dass Lehrerinnen und Lehrer (Lern)gruppen erstellen, ihre Schülerinnen und Schüler dann zu Gruppen zusammenfassen - um sich deren Arbeiten dann anzeigen lassen zu können. Meine Überlegung war, dass sie ihre Gruppenmitglieder mithilfe der Zuordnung zu ihrer Schule überhaupt erst finden können. Ist das vorstellbar? Iich habe keine Ahnung, ob das so überhaupt zu realisieren ist. Aber vielleicht lasse ich das, nach deiner Empfehlung, kleiner anzufangen, auch erstmal weg komplett weg.
Zu 1. In meinem bestehenden Rechentrainer habe ich, wie gesagt, vorgegeben, wie weit die Kids in einem bestimmten Schuljahr und einer bestimmten Schulwoche gekommen sein müssten. Alle diese Aufgabentypen, von denen sie noch nicht mindestens 10 richtig gelöst haben, färben sich rot. Außerdem erstelle ich mit dieser Vorgabe zurzeit auch automatisch eine Note. (Das mit der Note werde ich wahrscheinlich weder hinbekommen und auch nicht angehen). Die Kids sollen aber erkennen können, was sie eigentlich alles gemacht haben müssen. Wie du schon vorschlägst, sollte ich vielleicht nicht alles gleich einbauen, habe aber schon gemerkt, dass, wenn ich die Daten mit Inhalten fülle und dann Felder in den Models einfüge, es Schwierigkeiten gibt. Also lasse ich die Idee, dass andere Schulen andere Vorgaben machen können erst mal weg, werde es aber für die einzelnen Kategorien mit meinen Vorgaben füllen.
Zu 3, 4 und 5. Wie ich geschrieben habe, war die Überlegung, dass Lehrerinnen und Lehrer (Lern)gruppen erstellen, ihre Schülerinnen und Schüler dann zu Gruppen zusammenfassen - um sich deren Arbeiten dann anzeigen lassen zu können. Meine Überlegung war, dass sie ihre Gruppenmitglieder mithilfe der Zuordnung zu ihrer Schule überhaupt erst finden können. Ist das vorstellbar? Iich habe keine Ahnung, ob das so überhaupt zu realisieren ist. Aber vielleicht lasse ich das, nach deiner Empfehlung, kleiner anzufangen, auch erstmal weg komplett weg.
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
Das stimmt garantiert! also werfe ich jetzt mal alles was für zukünftge Erweiterungen bestimmt ist raus (und überlasse das dem Schulbuchverlag, der mir das Projekt dann für eine Millon abkauft).sparrow hat geschrieben: Montag 14. Februar 2022, 18:50 Und du musst dich darauf einstellen, dass du den Code irgendwann weg wirfst und von vorne beginnst.
Was aber viel Arbeit machen wird, sind die Einträge in der Datenbank unter "Fragen", kann ich die irgendwie dort rausziehen und in ein neues Projekt wieder einfügen. Bei "models.py" oder "views.py" ist das ja einfach - aber Datenbankeinträge?
Im günstigsten Fall ziehst du sie über das Datenbankmanagementsystem heraus.
Django kann auch Daten aus der Datenbank dumpen:
gibt mehr Informationen.
Django kann auch Daten aus der Datenbank dumpen:
Code: Alles auswählen
python manage.py dumpdata --help
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
Danke für die Info. ich habe jetzt schonmal mein Projekt stark verschlankt und werde mich jetzt mal an den Aufgaben versuchen.
Das kann man zum Beispiel mit dem choices Parameter lösen.Wie kann ich hier dafür sorgen, dass man/frau bei Anrede unter Hr. und Fr. wählen kann?
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
Sieht gut aus, Danke!
Ich habe aber noch Probleme die Gebrauchsanweisung zu verstehen:
Warum muss ich am Anfang 5 Variable definieren? Warum steht unten in der Funktion "Junior" und "Senior"?

Aber ich habe es einfach mal ausprobiert. Ich möchte, dass die Schüler zwischen vier Schultypen wälken können. Ich bekomme keine Fehlermeldung ... es wird aber auch keine Auswahlmöglichkeit angezeigt. Was fehlt noch?
... und ganz toll wäre es, wenn es mir gelingen würde, bei Wahl von "Förderschule" einen "True"-Eintrage in kurs_i erzeugen könnte und bei Wahl von "Gymnasium" oder "Realschule" entsprechend bei "kurs_E".
Ich habe aber noch Probleme die Gebrauchsanweisung zu verstehen:
Warum muss ich am Anfang 5 Variable definieren? Warum steht unten in der Funktion "Junior" und "Senior"?

Aber ich habe es einfach mal ausprobiert. Ich möchte, dass die Schüler zwischen vier Schultypen wälken können. Ich bekomme keine Fehlermeldung ... es wird aber auch keine Auswahlmöglichkeit angezeigt. Was fehlt noch?
Code: Alles auswählen
class Schueler(models.Model):
nachname = models.CharField(max_length=20)
vorname = models.CharField(max_length=20)
klasse = models.CharField(max_length=10)
jahrgang = models.PositiveSmallIntegerField(default=0)
class kurs(models.Model):
GYMNASIUM = 'Y'
REALSCHULE = 'R'
HAUPTSCHULE = 'H'
kurs_wahl = [
(GYMNASIUM, 'Gymnasium'),
(REALSCHULE, 'Realschule'),
(HAUPTSCHULE, 'Hauptschule'),
(FOERDERSCHULE, 'Förderschule'),
]
kurs = models.CharField(
max_length=1,
choices=kurs_wahl,
default=REALSCHULE,
)
def is_upperclas(self):
return self.kurs
kurs_i = models.BooleanField(default=False, verbose_name="Förderkind", editable=False)
kurs_E = models.BooleanField(default=True, verbose_name="E-Kurs", editable=False)
datum_start = models.DateField(auto_now_add=True, verbose_name="Startdatum", editable=False, )
stufe = models.PositiveSmallIntegerField(default=0, editable=False)
halbjahr = models.PositiveSmallIntegerField(default=0, editable=False)
voreinst = models.IntegerField(default=1) #hier könnte, mithilf von Primzahlen, Voreinstellungen gesetzt und abgefragt werden
def __str__(self):
return f"({self.vorname} {self.nachname}, {self.klasse})"
Irgend etwas stimmt mit deiner Einrückung nicht.
Warum steht class "kurs" in class "Schueler"?
Wenn sich aus dem Eintrag eines Feldes etwas ableiten lässt, dann gehören diese Informationen nicht zusätzlich in das Model. "kurs_i" und "kurs_E" können also weg.
Warum steht class "kurs" in class "Schueler"?
Wenn sich aus dem Eintrag eines Feldes etwas ableiten lässt, dann gehören diese Informationen nicht zusätzlich in das Model. "kurs_i" und "kurs_E" können also weg.
Code: Alles auswählen
class Kurs(models.IntegerChoices):
GYMNASIUM = 1, "Gymnasium"
REALSCHULE = 2, "Realschule"
HAUPTSCHULE = 3, "Haupschule"
FOERDERSCHULE = 4, "Förderschule"
class Schueler(models.Model):
# [...]
kurs = models.IntegerField(choices=Kurs.choices, default=Kurs.GYMNASIUM)
Code: Alles auswählen
if schueler.kurs in (Kurs.GYMNASIUM, Kurs.REALSCHULE):
# [....]
Im Zweifelsfall kann man auch noch eine property definieren, die einem die Information gibt.
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
Hallo Sparrow,
ich habe jetzt zwischen deinen Postings mich selbst am zweiten Beispiel in der Dokumntation versucht und jetzt klappt schon mal die Auswahl:
.. ein bißchen anders als bei dir, aber es funktioniert (ich bin ganz stolz).
Und bei der zweiten Frage bin ich halt wahrscheinlich noch meinem alten Denken verhaftet. Die Kids bekommen mehr als diese möglichen vier Auswahlmöglichkeiten, ich muss auch noch die diversen Möglichkeiten der Kurse in den Gesamtschulen anbieten. Im Endeffekt sortiere ich die aber eigentlich (bisher) nur in zwei Gruppen "Förderkinder" (die bekommen einfache Aufgaben und immer alle Auswahlmöglichkeiten (z.B. mit oder ohne Kommazahlen)) und die zweite Unterscheidung ist (bisher) nur "E" (schwieriger) oder "G" (einfacher). Und da ich diese Abfrage sehr oft brauche, hatte ich mir vorgestellt, dass ich in meinem Code dann jeweils "if kurs_i: ..." und/oder "if kurs_E:..." einsetzen kann, anstelle zwischen Gymnasium, Realschule, A-Kurs, E-Kurs einerseits und Hauptschule, C-Kurs, Förderschule andererseits unterscheiden zu müssen. Da war meine Idee, einfach zwei logische Abfragen in der Schülertabelle zu speichern. Das müsste ich doch einfach beim Anlagen eines neuen Schülers mit "super().save(*args, **kwargs)" realisieren können.
ich habe jetzt zwischen deinen Postings mich selbst am zweiten Beispiel in der Dokumntation versucht und jetzt klappt schon mal die Auswahl:
Code: Alles auswählen
class Schueler(models.Model):
nachname = models.CharField(max_length=20)
vorname = models.CharField(max_length=20)
klasse = models.CharField(max_length=10)
jahrgang = models.PositiveSmallIntegerField(default=0)
class kurs(models.TextChoices):
GYMNASIUM = 'Y', _('Gymnasium')
REALSCHULE = 'R', _('Realschule')
HAUPTSCHULE = 'H', _('Hauptschule')
kurs= models.CharField(
max_length=1,
choices=kurs.choices,
default=kurs.REALSCHULE,
)
Und bei der zweiten Frage bin ich halt wahrscheinlich noch meinem alten Denken verhaftet. Die Kids bekommen mehr als diese möglichen vier Auswahlmöglichkeiten, ich muss auch noch die diversen Möglichkeiten der Kurse in den Gesamtschulen anbieten. Im Endeffekt sortiere ich die aber eigentlich (bisher) nur in zwei Gruppen "Förderkinder" (die bekommen einfache Aufgaben und immer alle Auswahlmöglichkeiten (z.B. mit oder ohne Kommazahlen)) und die zweite Unterscheidung ist (bisher) nur "E" (schwieriger) oder "G" (einfacher). Und da ich diese Abfrage sehr oft brauche, hatte ich mir vorgestellt, dass ich in meinem Code dann jeweils "if kurs_i: ..." und/oder "if kurs_E:..." einsetzen kann, anstelle zwischen Gymnasium, Realschule, A-Kurs, E-Kurs einerseits und Hauptschule, C-Kurs, Förderschule andererseits unterscheiden zu müssen. Da war meine Idee, einfach zwei logische Abfragen in der Schülertabelle zu speichern. Das müsste ich doch einfach beim Anlagen eines neuen Schülers mit "super().save(*args, **kwargs)" realisieren können.
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
OK, dann probiere ich halt lieber deine Methode aus.sparrow hat geschrieben: Mittwoch 16. Februar 2022, 17:24 Kannst du machen.
Ich empfehle trotzdem dringend, das nicht zu tun.
aber ... ich habe mich zu früh gefreut: ich kann beim Anlegen eines Schülers zwar den Kurs auswählen, beim Speichern bekomme ich aber die Fehlermeldung "table core_schueler has no column named kurs".
Also fehlt noch was. Wahrscheinlich muss ich mich doch noch damit beschäftigen, was diese Funktion macht und warum da von den fünf Einträgen ausgerechnet "JUNIOR" und "SENIOR" steht.

- __blackjack__
- User
- Beiträge: 14031
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Pitwheazle: Das sind halt die beiden Bezeichnungen die zu ”upperclass” gehören. Also die beiden Jahrgänge sind die “höheren Klassen”. Wenn das College Wohnungen stellt, kann das beispielsweise darüber entscheiden ob man ein Einzelzimmer bekommt/bekommen kann. Die Anfänger eher nicht, die höheren Klassen eher ja. Oder ob man Tutorenstellen annehmen kann, und ähnliches. Benutzt das Beispiel diese Methode nicht für irgend etwas?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Die Funktion (bei Klassen nennt man das Methode) kannst du eigentlich ignorieren. Das geht inhaltlich ein bisschen in die Richtung meines vorletzten Posts in diesem Thread, der ja leider etwas Verwirrung gestiftet hatte. Man kann in Django-Modellen nicht nur Felder definieren, sondern auch beliebige Methoden, die auf den Feldern operieren oder irgendeine Aktion, die an oder mit dem Modell durchgeführt wird, implementieren. Ein fiktives Beispiel wäre etwa eine Auswahl des Jahrgangs (1-13) und dann könntest du eine Methode is_oberstufe definieren, die eben zurück gibt, ob als Jahrgang ein Wert zwischen 11 und 13 gewählt wurde. Mit dieser Methode kannst du dann später an anderen Stellen in Django arbeiten.Pitwheazle hat geschrieben: Mittwoch 16. Februar 2022, 17:54 Wahrscheinlich muss ich mich doch noch damit beschäftigen, was diese Funktion macht und warum da von den fünf Einträgen ausgerechnet "JUNIOR" und "SENIOR" steht.
Das ist im Grunde nur eine Frage der Notation. Du müsstest es nicht so schreiben, aber es macht aus mehreren Gründen Sinn, das zu tun. "choices" erwartet als Wert eine Sequenz von 2-er Tupeln. Das erste Element des Tupels ist der Wert (oft irgendein Code oder Kürzel oder irgendeine Zahl), der in der Datenbank gespeichert wird, das zweite ein menschenlesbares Label. Für die Wert verwendet man oft Konstanten, die besser beschreiben, was sich dahinter verbirgt und die eine nachträgliche Änderung erleichtern. In dem Beispiel werden diese Sachen etwas auseinander gezogen notiert, weil man damit flexibler arbeiten kann und es sich auch besser liest. Theoretisch könnte man sich das auch sparen und alles am Stück an die Stelle schreiben, an der "choice=" steht. Dann kann man aber zum Beispiel in der Methode nicht mehr so schön auf die einzelnen Elemente zugreifen.Warum muss ich am Anfang 5 Variable definieren?
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
ja, doch - da müsste man halt Gebrauchsanweisungen lesen können:__blackjack__ hat geschrieben: Mittwoch 16. Februar 2022, 18:11 Benutzt das Beispiel diese Methode nicht für irgend etwas?

... also wird hier wohl, wie du sagst, eine Unterklasse erstellt.
Ich habe meinen Code jetzt so (ähnlich) geändert, wie du es beschrieben hast, sieht auch gut aus:
Code: Alles auswählen
class kurswahl(models.TextChoices):
GYMNASIUM = 'Y', 'Gymnasium'
REALSCHULE = 'R', 'Realschule'
HAUPTSCHULE = 'H', 'Hauptschule'
E_KURS = 'E', 'E-Kurs'
class Schueler(models.Model):
nachname = models.CharField(max_length=20)
vorname = models.CharField(max_length=20)
klasse = models.CharField(max_length=10)
jahrgang = models.PositiveSmallIntegerField(default=0)
......
"kurs" ist aber da:
Code: Alles auswählen
migrations.CreateModel(
name='Schueler',
fields=[
...
('kurs', models.CharField(choices=[('Y', 'Gymnasium'), ('R', 'Realschule'), ('H', 'Hauptschule'), ('E', 'E-Kurs')], default='E', max_length=1)),
...
],
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
@nezzcarth Danke für die Info - ist ja alles ganz logisch und irgendwann beherrsche ich das hoffentlich auch alles (sicher bin ich aber nicht).
-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
Heute funktioniert mal alles!
Jetzt hätte ich aber noch gerne, dass der Jahrgang automatisch aus der Klassenbezeichnung gebildet wird. In unserer Schule heißen die Klasse z.B "8.6". Direkt in Python ergibt klasse="8.6" und int(klasse), wie gewünscht 8. Django mag das anscheinend nicht, oder ich mache was falsch:
erzeugt einen Fehler (wäre ja auch zu einfach gewesen): "invalid literal for int() with base 10: '8.6'". Wenn ich als Klasse" 8" eingebe, klappt das, "8.6" mag Django nicht.
Zusätzlich gibt es natürlich an anderen Schulen auch andere Bezeichnungen. Bekkannt ist zum Beispiel "8a" oder auch "8g1". Ich könnte die Klassenbezeichnung mit einer Liste ("5", "6", ...) vergleichen - oder habt ihr eine elegantere Idee wie ich nach einer Zahl zwischen 5 und 10 in einem String suchen kann?
Jetzt hätte ich aber noch gerne, dass der Jahrgang automatisch aus der Klassenbezeichnung gebildet wird. In unserer Schule heißen die Klasse z.B "8.6". Direkt in Python ergibt klasse="8.6" und int(klasse), wie gewünscht 8. Django mag das anscheinend nicht, oder ich mache was falsch:
Code: Alles auswählen
def save(self, *args, **kwargs):
self.jahrgang=int(self.klasse)
super().save(*args, **kwargs)
Zusätzlich gibt es natürlich an anderen Schulen auch andere Bezeichnungen. Bekkannt ist zum Beispiel "8a" oder auch "8g1". Ich könnte die Klassenbezeichnung mit einer Liste ("5", "6", ...) vergleichen - oder habt ihr eine elegantere Idee wie ich nach einer Zahl zwischen 5 und 10 in einem String suchen kann?
Im Prinzip ginge das mit regulären Ausdrücken. Persönlich würde ich aber gerade dazu neigen, das nicht zu parsen sondern explizit im Modell zu hinterlegen. Wer weiß, ob es nicht irgendwo ein traditionsbewusstes Lyzeum gibt, in dem die Klassen nach katholischen Heiligen benannt sind?Pitwheazle hat geschrieben: Donnerstag 17. Februar 2022, 14:21 Bekannt ist zum Beispiel "8a" oder auch "8g1". Ich könnte die Klassenbezeichnung mit einer Liste ("5", "6", ...) vergleichen - oder habt ihr eine elegantere Idee wie ich nach einer Zahl zwischen 5 und 10 in einem String suchen kann?

-
- User
- Beiträge: 1053
- Registriert: Sonntag 19. September 2021, 09:40
@sparrow: In unserer Schule ja und andere Möglichkeiten sind mir nicht bekannt, lassen sich aber nicht ausschließen. Da dies ein Textfeld ist, können die Kids natürlich irgendwas eingeben - den Fall könnte ich aber doch mit einem Fehler abfangen und eine explizite Eingabe zwischen 5 und 10 verlangt werden? Meine Aufgaben sind so angelegt, dass hier ein Wert zwischen 5 und 10 stehen muss. (In meinem existierenden Rechentrainer gibt es zwar auch Aufgaben für Grundschüler, die lasse ich aber wohl weg.)
Hast du eine Idee, warum das mit int(klasse) nicht funktioniert?
Hast du eine Idee, warum das mit int(klasse) nicht funktioniert?
... klingt prima, dann muss ich nur noch lernen, wie sich Frontend und Backend unterscheiden, was parsen bedeutet und Java Script lernen. Dann lasse ich das jetzt halt erstmal dabei, dass Klasse und Jahrgang getrennt eingegeben werden und der Jahrgang zwischen 5 und 10 liegen muss. Und dann sehen wir später weiter. Wahrscheinlich muss ich bei meinem Projekt jetzt aber erstmal soweit kommen, dass ich lerne, wie die Anmeldung von Schülern überhaupt vor sich geht. Das hatte ich bisher in keinem Tutorium.nezzcarth hat geschrieben: Donnerstag 17. Februar 2022, 17:53Im Prinzip ginge das mit regulären Ausdrücken. Persönlich würde ich aber gerade dazu neigen, das nicht zu parsen sondern explizit im Modell zu hinterlegen. Wer weiß, ob es nicht irgendwo ein traditionsbewusstes Lyzeum gibt, in dem die Klassen nach katholischen Heiligen benannt sind?Pitwheazle hat geschrieben: Donnerstag 17. Februar 2022, 14:21 Bekannt ist zum Beispiel "8a" oder auch "8g1". Ich könnte die Klassenbezeichnung mit einer Liste ("5", "6", ...) vergleichen - oder habt ihr eine elegantere Idee wie ich nach einer Zahl zwischen 5 und 10 in einem String suchen kann?Mein Ansatz wäre eher, das vielleicht bei der Eingabe später im Frontend mit JavaScript zu erledigen. Wenn dein Parser das irgendwie aus der Klassenangabe extrahieren kann, wird das Jahrgangsfeld vorausgefüllt und wenn nicht, muss es eben händisch eingetragen werden. Und bei Fehlern kann man es korrigieren. Das kommt mir gerade robuster vor. Aber vielleicht liege ich auch falsch.