Drei Aufgaben zur Wahl

Die drei Aufgaben sind voneinander unabhängig. Keine baut auf einer anderen auf, keine schließt eine andere aus, und es gibt keine Reihenfolge. Nimm eine, nimm zwei, nimm alle drei – oder bleib bei einer und mach sie gründlich.

leicht Lesedauer anzeigen mittel Kategorieseiten höher Wunschliste
Vorher einmal prüfen, dass alles läuft: python manage.py check, dann python manage.py test, dann python manage.py runserver. Wenn das jetzt grün ist, weißt du später, dass ein Fehler von deiner Änderung kommt.

leicht 1 · Lesedauer auf der Buchseite

Zwei Dateien, keine Datenbankänderung. Wer zügig arbeitet, ist in einer halben Stunde fertig.

Worum es geht

Auf der Detailseite eines Buchs steht die Seitenzahl. Daraus lässt sich eine geschätzte Lesedauer errechnen – rechne mit rund 45 Seiten pro Stunde. Diese Schätzung soll als eigene Zeile auf der Buchseite erscheinen.

Fertig ist es, wenn

Dateien, die du anfasst

DateiWas dort hinkommt
bibliothek/templatetags/bibliothek_extras.pyein neuer Filter
bibliothek/templates/bibliothek/buch_detail.htmleine neue Zeile in der Datenliste

Schritte

  1. Sieh dir in bibliothek_extras.py die vorhandenen Filter sterne und tage_bis an. Dein Filter folgt demselben Muster.
  2. Schreibe einen Filter, der aus einer Seitenzahl einen Text macht. Der Dekorator darüber lautet @register.filter.
  3. Server neu starten. Änderungen an Template-Tags werden beim Laden gefunden, nicht bei jedem Aufruf.
  4. Ergänze in buch_detail.html innerhalb der Liste <dl class="daten"> ein Paar aus <dt> und <dd> und wende deinen Filter auf buch.seiten an. Wie das aussieht, zeigt die Zeile mit der Bewertung direkt darüber.

Stolpersteine

Im Buch: Templates und ihre Erweiterungen

mittel 2 · Seiten für Kategorien

Zwei neue Sichten, zwei neue Vorlagen, keine Datenbankänderung. Etwa eine Stunde.

Worum es geht

Die Kategorien tauchen bisher nur als Filterleiste über der Buchliste auf. Sie sollen eigene Seiten bekommen: eine Übersicht aller Kategorien mit der Zahl ihrer Bücher, und pro Kategorie eine Seite mit den zugehörigen Büchern.

Fertig ist es, wenn

Dateien, die du anfasst

DateiWas dort hinkommt
bibliothek/views.pyzwei Sichten
bibliothek/urls.pyzwei Routen mit Namen
bibliothek/templates/bibliothek/zwei neue Vorlagen
templates/base.htmloptional ein Eintrag in der Navigation

Schritte

  1. Schau dir autor_liste in views.py an. Deine Kategorieübersicht ist dieselbe Bauform: abfragen, an eine Vorlage geben.
  2. Die Anzahl der Bücher hängst du mit annotate an jede Kategorie. Wie das geht, steht in derselben Datei bei autor_liste.
  3. Für die Detailseite brauchst du die Kategorie anhand ihres Slugs. Nimm get_object_or_404; die Bücher erreichst du über den Rückweg der Beziehung, den related_name im Modell festlegt.
  4. Trage beide Routen in bibliothek/urls.py ein und gib ihnen einen name. Für den Slug ist der Konverter <slug:...> zuständig.
  5. Die Vorlagen beginnen mit {% extends "base.html" %}. Für die Buchkarten kannst du {% buch_karte buch %} wiederverwenden – das gibt es schon.

Stolpersteine

Im Buch: Der ORM und seine QuerySets, Views zwischen Funktion und Klasse, Vom WSGI-Aufruf bis zur Antwort

höher 3 · Wunschliste

Ein neues Modell samt Migration, Formular, Sicht, Vorlage, Admin und einem Test. Zwei Stunden, eher mit Pausen.

Worum es geht

Angemeldete Personen sollen Bücher vormerken können, die es im Bestand noch gar nicht gibt: Titel, eine kurze Begründung, fertig. Jede sieht ihre eigenen Wünsche, die Bibliothek sieht im Admin alle. Die Wunschliste hängt an keinem vorhandenen Modell – sie kommt neu dazu und kollidiert deshalb mit nichts.

Fertig ist es, wenn

Dateien, die du anfasst

DateiWas dort hinkommt
bibliothek/models.pyein Modell Wunsch
bibliothek/migrations/wird erzeugt, nicht geschrieben
bibliothek/forms.pyein ModelForm
bibliothek/views.pyeine Sicht für Anzeigen und Anlegen
bibliothek/urls.pyeine Route
bibliothek/templates/bibliothek/eine Vorlage
bibliothek/admin.pyeine ModelAdmin
bibliothek/tests.pyein Test

Schritte

  1. Modell. Felder: Titel, Begründung, wer es wünscht, wann angelegt. Für die Person verweist du nicht direkt auf User, sondern auf settings.AUTH_USER_MODEL – wie es Ausleihe vormacht. Vergiss __str__ und die Meta-Angaben nicht.
  2. Migration. python manage.py makemigrations, die erzeugte Datei einmal lesen, dann python manage.py migrate. Beides ist nötig.
  3. Formular. Ein ModelForm mit den Feldern, die eine Person selbst eintippt – also ohne Person und ohne Zeitstempel. BuchForm und AusleiheForm sind die Vorbilder.
  4. Sicht. Eine Funktion mit @login_required, die bei GET das Formular und die eigenen Wünsche zeigt und bei POST speichert. Die Person setzt du selbst, mit form.save(commit=False). Genau dieses Muster steht in ausleihen.
  5. Route und Vorlage wie gewohnt, mit name und extends "base.html".
  6. Admin. Eine Klasse mit @admin.register(Wunsch) und ein paar Spalten in list_display.
  7. Test. Einer genügt: anmelden, Wunsch abschicken, prüfen, dass er in der Datenbank steht. test_anlegen_mit_login in tests.py zeigt die Bauform.

Stolpersteine

Im Buch: Das Datenmodell, Formulare und Validierung, Der Admin als generierte Oberfläche

KI sinnvoll einsetzen

Für alle drei Aufgaben ist eine KI ein gutes Werkzeug – wenn du sie führst und nicht umgekehrt. Was in der Praxis den Unterschied macht:

Wenn etwas klemmt

MeldungErste Maßnahme
no such tablepython manage.py migrate
NoReverseMatchName und Namensraum im url-Tag prüfen
TemplateDoesNotExistPfad der Vorlage prüfen: <app>/templates/<app>/…
is not a registered tag libraryServer neu starten
Seite bleibt leer, kein FehlerSchreibweise der Variablen im Template prüfen
Formular speichert nichts, keine Meldung{{ form.errors }} ins Template

Alles zurücksetzen, was du geändert hast: git checkout -- . verwirft die Änderungen an den Dateien, python manage.py migrate bibliothek 0001 setzt die Datenbank auf den Ausgangsstand zurück.