Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.
12:34

Generic Views wiederverwerten

Nachdem Dennis gestern schon einen ziemlich kontrovers diskutierten Artikel zu seinem lila Elefanten geschrieben hat, möchte ich heute lieber mal was Praktisches beschreiben und euch nochmal zeigen, welche wirklich netten Details die Gitarren spielende Komikergruppe noch so für einen bereit stellt. Wie schon kommentiert, kommt es für mich auf das Feeling eines Frameworks an, und ich finde, mit ein bisschen “Recycling” kann man das ganz gut beschreiben.

Django an sich ist ganz im Sinne von “Don’t repeat yourself”1 geschrieben, was durch intelligente Objekt Orientierung auch sehr gut umgesetzt ist. Das ermöglicht es einem, nicht nur die vorhanden Django-internen, High-Level-Frameworks zu benutzen, sondern man hat auch direkten Zugriff2 auf die darunter liegenden Funktionen bzw. Low-Level-Frameworks. So kann man verdammt viel von Djangos Kern- oder mitgelieferten Modulen in seinen eigenen Modulen wiederverwerten. Ich möchte das mal an dem Beispiel von den äußerst praktischen Generic Views erläutern.

Was sind Generic Views?

Generic Views” sind Djangos Antwort auf immer wiederkehrende, langweilige Views3. Anstatt immer wieder Views zu schreiben, die einfach nur ein bestimmtes einzelnen Queryset ausführen und an ein Template weitergeben, bietet Django in django.views.generic eine Ansammlung von allgemeinen Views, denen man ein paar Argumente übergibt und die dann solche Aufgaben für einen schnell mit nur einer Zeile in der URL-Config bewältigen.

Hier ein Beispiel direkt aus der URL-Config von Flusicr, dadurch werden die Startseite und die Einzelseiten erstellt (ich hab den Code noch etwas schöner formatiert):


urlpatterns = patterns('',
    url(
        r'^$', 
        'django.views.generic.list_detail.object_list', 
        dict(flusicr_dict, paginate_by=2, template_name="blog/home.html"),
        name="flusicr-home"
    ),
    url(
        r'^artikel/(?P.*)/$', 
        'django.views.generic.list_detail.object_detail', 
        dict(flusicr_dict, slug_field='slug', template_name="blog/detail.html"),
        name="flusicr-detail"
    ),
)

So gibt Generic Views um direkt ein Template anzuzeigen, um einfach zu einer anderen URL weiterzuleiten, oder aber, um die Einträge von einem bestimmten Tag/Woche/Monat/Jahr anzuzeigen, um eine einfache List- und Detail-Ansicht mit Pagination zu machen, oder auch um ganze CRUD Aufgaben zu übernehmen.

Das will ich auch haben!

Bis jetzt haben wir Seiten, deren Daten wir mit einem einfachen Queryset gefüllt haben (im obigen Beispiel ist das in fluscir_dict enthalten). Aber was, wenn wir plötzlich die Daten immer noch so einfach anzeigen möchten, sie aber komplizierter filtern müssen?

Auch das ist kein Problem, denn wir können ganz einfach unsere eigenen Views die Funktion eines Generic Views ausgeben lassen! Damit müssen wir unseren View nicht unnötig überfüllen mit Pagination, Template-Auswahl etc. sondern überlassen das einfach dem Generic View (als Keyword-Argumente):


from django.shortcuts import get_object_or_404
from django.views.generic.list_detail import object_list
from conescy.apps.everything.models import *

def author(request, author, app=False, **kwargs):
"""Displays the articles one author has written"""
if app == False: app = kwargs.pop("app")
u = get_object_or_404(User, username=author)
e = Entry.objects.filter(author=u, status="public", app=app).order_by("-created")
if not kwargs.get("extra_context", False): kwargs["extra_context"] = {}
kwargs["extra_context"]["author"] = author
return object_list(request, e, **kwargs)

Damit können wir so bequem und schnell wie mit “richtigen” Generic Views eine Autor-Seite einrichten. Hier auch wieder ein Teil aus der original Flusicr-Config4:

url(
    r'^autor/(?P.*)/$', 
    'conescy.apps.everything.views.author', 
    dict(app="flusicr", paginate_by=10, template_name="blog/autor.html"), 
    name="everything-author"
),

PS: Ein ähnlicher Artikel mit noch ein paar Zusatz-Informationen Zu Generic Views gibt es bei B-List!

1 Die Idee, eine Aufgabe oder eine Angabe nur genau einmal zu lösen bzw. zu machen, siehe auch Wikipedia

2 Wir erinnern uns an gutes OOP, klare Strukturen und natürlich Namespaces, Dennis?

3 Bei Django ist das die “Controller”-Funktion, der die Daten ausliest und verarbeit, also bestimmt was angezeigt wird.

4 Die fertige Seite könnt ihr übrigens hier sehen!

Don't be the product, buy the product!

Schweinderl