virtualenv für die Isolation der Projekte nutzen
pip zum Installieren von Python Paketen nutzen
Django “Projekte” bestehen im Kern nur aus der Konfiguration in settings.py
- Diese verweist auf die zentrale URLConf (ROOT_URLCONF)
- Sie enthält die Liste aller installierten Apps, die nicht zwingend im Projektverzeichnis sein müssen sondern aus dem PYTHONPATH geladen werden können
- Eine Konstante wie zum Beispiel SITE_ROOT nutzen, um den Pfad zum Konfigurationsverzeichnis zur Laufzeit zu ermitteln
- Zusätzliche Dateien wie zum Beispiel local_settings.py für das Trennen der Einstellungen benutzen
- Eventuell paster create zur Erstellung von Projekten nutzen
Das Verzeichnis einer App sollte immer alle nötigen Komponenten enthalten
- URLConf (urls.py)
- In der URLConf immer “named URLs” benutzen
Models (models.py)
- Templates (templates/APPNAME/*.html)
- Die Verzeichnisstruktur so aufbauen, dass die Templateloader auch richtig funktionieren
Templatetags (templatetags)
Views (views.py)
Fomulare (forms.py)
Fixtures (Verzeichis fixtures)
Tests (tests.py)
...
Innerhalb einer App immer relative Imports benutzen (siehe PEP 328)
Falls nötig eine App in Python Packages für Models, Views oder Tests aufteilen
Models
Für models.DateTimeField nicht auto_add und auto_add_now Argumente benutzen, sondern die Logik selbst implementieren
Methoden möglichst flexibel überschreiben:
def save(self, *args, **kwargs): # Code, der beim Speichern ausgeführt wirdEin QuerySet benutzt “lazy loading” und kann immer um neue Bedigungen erweitert werden, so lange es noch nicht ausgegeben oder ein Iterator benutzt wurde
QuerySet.count() statt len(QuerySet) benutzen
Mit einem “related manager” auf das andere Model einer Relation zugreifen
models.Q für OR Queries oder Factories nutzen
Komplexe Queries und Funktionen als Methoden am Model implementieren
Views
- Funktionen aus django.shortcuts nutzen
- Class-based views nutzen
Templates
- Keine Logik in Templates implementieren
- block Tags können auch gut zum Kontrollieren von Templates benutzt werden, die man erweitert hat (Beispiel toggle_login Block)
- 404.html und 500.html anlegen (siehe Fehlerbehandlung)
Debugging
- Django Debug Toolbar nutzen
- Das in Django 1.3 eingeführte Logging-Framework nutzen
- Den Python-Debugger nutzen
Tests
- Statt Doctests besser Unittests nutzen
- Test-Abdeckung mit Hilfe von coverage ermitteln
Nicht davor zurückschrecken eine Middleware zu schreiben