===== 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
|