Zum Inhalt springen
Der Guide für ein smartes Leben.
Web-Anwendungen mit Django

Teil 4: Django: Alternative zu PHP

Autor: Redaktion pcmagazin • 3.3.2009 • ca. 3:10 Min

View erstellen Nachdem der Admin-Bereich steht, geht es jetzt um die eigentliche Website. Hier arbeiten wir mit den beiden Dateien urls.py und views.py und einigen zugehörigen Templates. Zu diesem Zweck ist es sinnvoll, ein eigenes Verzeichnis templates im Projektordner anzulegen und darin ein Un...

View erstellen

Nachdem der Admin-Bereich steht, geht es jetzt um die eigentliche Website. Hier arbeiten wir mit den beiden Dateien urls.py und views.py und einigen zugehörigen Templates. Zu diesem Zweck ist es sinnvoll, ein eigenes Verzeichnis templates im Projektordner anzulegen und darin ein Unterverzeichnis mit dem Anwendungsnamen, also templates/solarprojects.

Den kompletten Pfad zu diesem Verzeichnis müssen Sie in Ihrer settings.py wieder zur Liste TEMPLATE_DIRS hinzufügen (siehe oben). Die Aufteilung einer Webanwendung sieht folgendermaßen aus: In urls.py definiert man mithilfe von regulären Ausdrücken ein URL-Muster und ordnet diesem eine View zu, die aufgerufen wird, wenn das Muster auf die aktuelle Request-URL passt.

Ein Beispiel: Beim Aufruf von /projects/ soll die View index aufgerufen werden. Dazu tragen Sie folgende Zeile in urls.py zur Liste der url_pattern ein:

(r'^projects/$', 'solarsite.
solarprojects.views.index'),

Das vorangestellte r definiert dabei einen raw-String, in dem nichts escaped ist. Mehr zur Syntax der regulären Ausdrücke steht in der Python-Dokumentation. In der Datei views.py erstellen Sie jetzt die view index, indem Sie eine Funktion des gleichen Namens definieren:

def index(request):
project_list = Project.objects.
all().order_by('name')[:5]
return render_to_response
('solarprojects/index.html', {'project_list': project_list})

In dieser Funktion passieren zwei Dinge: Zuerst greifen wir über Project auf den O/R-Mapper und unser Datenmodell zu, um aus der Datenbank alle Projekte nach Namen sortiert abzurufen. Zweitens leiten wir die Ausgabe an das Template solarprojects/index.html weiter, und übergeben als Argument ein Python-Dictionary-Objekt mit der Projektliste. Bei render_to_response handelt es sich um einen Shortcut, der in django.shortcuts definiert ist.

Jetzt müssen wir nur noch das zugehörige Template index.html im neu anzulegenden Ordner templates/solarprojects erstellen:

{% extends "base.html" %}
{% block title %}<h1>Projektliste</h1>{% endblock %}
{% block content %}
{% if project_list %}<ul>
{% for project in project_list %}<li><a href="/projects/{{ project.id }} ">{{ project.name }}</a></li>
{%endfor%}{% endfor %}</ul>
{% else %}<p>Keine Projekte online.</p>
{% endif %}
{% endblock %}

In einem Template gibt man Variablen mit {{ var_name }} aus - in unserem Beispiel Name und Id eines Projektes. Mit Template_Tags, die mit {% tag_name %} angegeben sind, bestimmt man den Kontrollfluss der Ausgabe-Schleife - in unserem Beispiel for.

Es existieren aber auch Tags für []if-else, ifequal, ifnotequal. Mit den Tags block und extends definiert man Templates mit Vererbung. In unserem Beispiel erbt das Template von base.html. Dort ist quasi der Rahmen definiert, in dem die Block-Elemente ausgegeben werden. Ein sehr primitives Basis-Template könnte so aussehen:

<html><body><h1>{% block title %}Headline{% end
block %}</h1><div>{% block content %}Inhalt{% end
block %}</div></body></html>

Da im Index-Template bereits ein Link auf /projects/projects_id angelegt ist, um die Einzelheiten eines Projektes anzuzeigen, werden wir dies jetzt auch noch implementieren. Die zusätzliche Zeile in urls.py sieht so aus:

(r'^projects/(?P<project_id>\d+)/$',
'solarsite.solarprojects.views.project_detail'),

Dabei wird die ID des Projektes in der URL übergeben. Mit den Klammern geben wir an, dass der darin stehende Teil des regulären Teils beim Vergleich in einer Variable gespeichert wird. In der View wird diese Variable dann als Argument übergeben. Die Funktion project_detail() in views.py sieht also folgendermaßen aus:

def project_detail(request,
project_id):
project = get_object_or_404(
Project, pk=project_id)
return render_to_
response('solarprojects/project_detail.html', {'project': project})

Das entsprechende Template dazu zu erstellen, sollte für Sie jetzt kein Problem darstellen.

Komfortabel und schnell

In diesem Workshop konnten wir natürlich nur die grundlegenden Funktionen von Django erklären. Doch bereits damit wird klar, wie einfach und effizient sich Websites mit Django erstellen lassen. Gerade das relativ starre Grundgerüst erleichtert den Einstieg und sorgt dafür, dass man sich auch in anderen Django-Projekten leicht zurechtfindet.

Und der Komfort des automatisch erstellten Admin-Bereichs ist unschlagbar und kann zusammen mit der ebenfalls automatisch erstellten DB-Struktur und dem OR/Mapper schon fast alleine ein Grund sein, Django einzusetzen.

Weiterführende Informationen zu Themen wie Formularbehandlung- und Definition, Internationalisierung, Benutzerauthentifizierung oder Session-Verwaltung finden Sie im Dokumentationsbereich der Django-Website.