===== Model ===== * liegen in der Regel in models.py * definieren die Grundobjekte * eigentlich sind sie die Datenbankdarstellung * bringen Methoden mit um Objekte aus der Datenbank zu erstellen/zu filtern oder darin zu speichern * ein Objekt enthält die Daten eines "Objektes" in der Datenbank/ist ein Datensatz * basierend darauf kann das Admin-Interface generiert werden ===== admin ===== * in der Regel in admin.py definiert * stellt basierend auf den Models die admin.py zur Verfügung * definiert welche Tabellen eine Admin-Tabelle bekommen sollen from django.contrib import admin from . import models admin.site.register(models.Artikel) * in diesem Fall wird für die Tabelle Artikel (basierend auf den Feldern) im Admin-Interface eingeblendet ===== URLs ===== * sind in urls.py * macht das Mapping zwischen URL/Pfaden und Call-Back-Funktionen aka. Views from django.urls import path from . import views urlpatterns = [ path("/something/, views.something, name="mysomething") ] Die entsprechende view sieht so aus: def something(request, id): pass * request enthält den Request * was auch immer in <> in der View steht wird an die aufgerufene Funktion als Parameter übergeben * in diesem Fall "id" ===== views ===== * in der Regel in views.py * enthält die Funktionen die definieren was gesendet werden soll * also zum Beispiel ob eine Seite anhand eines Templates gerendert werden soll oder json zurück gegeben werden soll * was auch immer die Funktionen hier zurückgeben (in return) wird als Antwort gesendet def something(request, id): return HttpResponse(id) * der erste Parameter den eine view bekommt ist der Original-Request * die nachfolgenden sind die URL-Parameter (die in den views mit <> angegeben werden) * return gibt den Response zurück * HttpResponse gibt einen rohen HttpRepsponse zurück und was auch immer der Klasse übergeben wird * render ist eine Methode die anhand eines Templates eine Seite rendert und diese dann zurückgibt ===== Template ===== ==== Bedingungen ==== === case/switch/select-Anweisung === Gibt es nicht - muss durch if-Anweisungen abgebildet werden. === if-else === {% if Bedingung %} Code {% else %} Code {% endif %} Ab django 1.4 existiert auch {% elif %}, voher kann man sich mit: {% load assign %} {% assign name="Variablenname" %} 0 {% endassign %} {% if Bedingung %} Code {% assign name="Variablenname" %} 1 {% endassign %} {% endif %} {% if Bedingung AND Variablenname == 0 %} Code {% assign name="Variablenname" %} 1 {% endassign %} {% endif %} {% if Bedingung AND Variablenname == 0 %} Code {% else %} Code {% endif %} Man setzt einfach eine Variable wenn ein if-Zweig durchlaufen wurde und prüft bei allen folgenden if-Anweisungen ob diese Variable auf 0 steht, steht sie auf 1, wurde bereits ein if-Zweig durchlaufen und es soll kein weiterer if-Zweig durchlaufen werden. Man erhält so eine case- oder switch-Anweisung. ==== Sonstiges ==== === Variablen zuweisen === * Geht standardmäßig nicht * Kann durch django-templateaddons (Name des Paketes) nachinstalliert werden \\ \\ Zuweisung: {% assign name="Variablenname" %} 1 {% endassign %} Auslesen: {{ Variablenname }} \\ bzw. letztendlich wie jede andere interne Variable auch \\ \\ **Hinweis:** Möglicherweise funktioniert Assign nur beim höchsten Eltern-Template (also bei Vererbung/verschachtelten Templates das Höchste - das was kein "extends" mehr enthält) ==== Limits ==== * Placeholder lassen sich nicht auf Inhalt prüfen * Man kann also nichts abhängig davon machen * Blocks lassen sich nicht auf Inhalt prüfen * Man kann also nichts abhängig davon machen ==== Troubleshooting ==== ^Problem ^Beschreibung ^ Mögliche Lösung ^ | Ein oder alle Blöcke ({% Block Name %}) werden leer ausgegeben | Obwohl die Blöcke einen Inhalt haben sollten, werden sie ohne Inhalt in der Website angezeigt - es kommt keine Fehlermeldung| Der Name eines oder mehrere Blöcke (es müssen alle Ebenen bei vererbten Templates geprüft werden) steht nicht in " ". \\ \\ Also (Falsch): \\ {% Block main %} \\ statt (Richtig): \\ {% Block "main" %} | |Ausgabe "The _imaging C module is not installed"|PIL (Python Image Librarie) vermisst das Modul _imaging bzw. das Modul ist nicht gegen die Systembibliotheken gelinkt.|PIL ist nur teilweise in Python relaisiert, ein Teil wird durch C-Bibliotheken erledigt (u.a. libjpeg) die über das PIL-eigene C-Modul _imaging realisiert wird. \\ Vor allem in virtualenv kann es nach dem verschieben auf eine andere Maschine zu Problemen kommen. \\ \\ * PIL deinstallieren (pip uninstall PIL) * python-dev installieren (aptitude install python-dev) * dev-Pakete der gewünschten Bildformate installieren (Zum Beispiel libjpeg-dev) * PIL installieren (pip install PIL) Durch das deinstallieren und wieder installieren wird _imaging neu compiliert und gegen die vorhandenen Systembibliotheken gelinkt |