Ausbau der Views

Die Views sind zwar schon relativ kompakt, enthalten aber immer noch einigen Code, der sich wiederholt. Also machen wir uns daran das zu verbessern.

Die Funktion render_to_response

Als Erstes entfernen wir die beiden folgenden Imports am Anfang der Datei recipes/views.py:

from django.http import Http404, HttpResponse
from django.template import Context, loader

Wir ersetzen sie mit dem folgenden Import:

from django.shortcuts import render_to_response

In django.shortcuts befinden sich mehrere Funktionen, die die Arbeit mit den Views erleichtern sollen. Eine davon ist render_to_response.

Sie kümmert sich um die folgenden Dinge:

  • Laden des Templates
  • Bereitstellen des Contexts
  • Template mit dem Context rendern
  • Einen HttpResponse zurückgeben, der das Ergebnis der Renderns enthält

Dadurch können wir die erste Funktion im View stark reduzieren. Der Beginn der Datei recipes/views.py sieht dann wie folgt aus:

from django.shortcuts import render_to_response

from recipes.models import Recipe

def index(request):
    recipes = Recipe.objects.all()
    return render_to_response('recipes/index.html', {'object_list': recipes})

Die Funktion get_object_or_404

Aber auch die zweite View Funktion wollen wir vereinfachen. Dazu nutzen wir eine weitere Funktion, die django.shortcuts bereitstellt - sie heißt get_object_or_404:

from django.shortcuts import get_object_or_404

def detail(request, slug):
    recipe = get_object_or_404(Recipe, slug=slug)
    return render_to_response('recipes/detail.html', {'object': recipe})

Die Funktion get_object_or_404 versucht eine Instanz des übergebenen Models mit der Manager-Methode get() zu holen. Das zweite Argument slug=slug wird dabei an get() übergeben. Wird kein entsprechendes Model gefunden wird eine Http404 Exception ausgelöst.

Die vollständige Datei

Wir haben also mit Hilfe der beiden Hilfsfunktionen den Code, den wir im View selbst schreiben müssen, stark reduziert.

from django.shortcuts import get_object_or_404, render_to_response

from recipes.models import Recipe

def index(request):
    recipes = Recipe.objects.all()
    return render_to_response('recipes/index.html', {'object_list': recipes})

def detail(request, slug):
    recipe = get_object_or_404(Recipe, slug=slug)
    return render_to_response('recipes/detail.html', {'object': recipe})

Inhalt

Vorheriges Thema

Debug Toolbar

Nächstes Thema

Vereinfachen und Entkoppeln der URLConf

Diese Seite