RkBlog

Hardware, programming and astronomy tutorials and reviews.

Widoki Django, obiekty Request i Response

Opis widoków Django, sposobów wyświetlania szablonów i danych.

Django jak i wiele innych frameworków stosuje wzorzec MVC, ale z małą różnicą. W Django nie mamy Model-View-Controler lecz Model-Template-View - MTV. Model opisuje strukturę tabel w bazie danych, Template czyli zwykły szablon opisuje wygląd, a View czyli widok pełni rolę kontrolera - opisuje działanie aplikacji. Różnica MVC - MTV polega na innym nazwaniu komponentów. Teraz zajmiemy się poznaniem widoków.

Budowa Widoków

We wprowadzeniu do django stworzyliśmy prostą aplikację, w której wykorzystaliśmy widok generyczny, jednak nie zawsze będziemy mogli skorzystać z takiego predefiniowanego widoku. Do definiowania własnych widoków służy plik:
NAZWA_APLIKACJI/views.py
W przypadku projektu z wprowadzenia:
news/views.py
Plik ten jest pusty i możemy umieszczać w nim wszystkie nasze widoki. Każdy widok to funkcja przyjmująca jeden obowiązkowy parametr request i zwracająca obiekt HttpRequest. Brzmi strasznie ale w rzeczywistości jest to bardzo proste. Każdy widok musimy przypisać do konkretnego URLa poprzez regułę w urls.py (o regułach w kolejnym artykule)... Dobra koniec, czas na przykład. Do news/views.py dodaj kod:
from django.http import HttpResponse

def test(request):
    return HttpResponse('To jest <b>tekst</b>')
Do urls.py dodaj regułę:
(r'^test/$', 'news.views.test'),
Teraz uruchom serwer deweloperski i otwórz w przeglądarce http://localhost:8080/test/:
python manage.py runserver 8080
W przeglądarce zobaczysz tekst z widoku. Właśnie stworzyliśmy prosty widok oraz przypisaliśmy go do URLa /test/ za pomocą prostej reguły. Zwracamy HttpResponse i wszystko działa, lecz dla 99% przypadków skorzystamy z render_to_response - nakładki na HttpResponse stosującej szablony oraz HttpResponseRedirect - przekierowania na inny adres URL aplikacji.

render_to_response

Oto najprostsze zastosowanie render_to_response, zastąp kod news/views.py:
from django.shortcuts import render_to_response

def test(request):
    return render_to_response('test.html')
Oraz stwórz szablon: templates/test.html o kodzie:
To jes <b>tekst</b>
I gotowe. Odśwież stronę - efekt powinien być ten sam. Teraz zajmiemy się się dodatkowymi możliwościami. By przekazać do szablonu dane należy podać je jako drugi parametr render_to_response w postaci słownika:
from django.shortcuts import render_to_response

def test(request):
    return render_to_response('test.html', {'imie': 'Piotr', 'framework': 'django'})
A w szablonie wystarczy wpisać:
{{ imie }} - {{ framework }}
W szablonie poszczególne zmienne dostępne są poprzez klucze słownika. render_to_response stosujemy w każdym normalnym widoku, gdy chcemy wyświetlić daną stronę na bazie szablonu. Należy pamiętać, że niektóre czynności można zrealizować przez generyczne widoki.

HttpResponseRedirect

Przekierowanie jest bardzo proste:
from django.http import HttpResponseRedirect

def test(request):
	return HttpResponseRedirect("/")
Jako parametr podajemy adres URL. Przekierowania stosujemy np. do przekierowania użytkownika, który wysłał formularz (po logowaniu - na jego profil, po dodaniu newsu - na stronę newsa itp.)

Obiekt HttpRequest

Parametr request przekazywany do każdego widoku zawiera wiele przydanych danych, przedstawionych poniżej. Wszystkie atrybuty poza session powinny być używane "tylko do odczytu".

METODY

Obiekty QueryDict

Obiekt QueryDict jest nieco zmodyfikowanym słownikiem zdolnym przechowywać wiele wartości dla jednego klucza. Dodatkowe metody (szczegóły w dokumentacji django):
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[('a', ['1', '2', '3'])]

Przykład

Najprostsze zobrazowanie zawartości request będzie jej wyświetlenie. print wyświetli zawartość request do okna terminala z działającym serwerem deweloperskim:
def test(request):
    print request
    return render_to_response('test.html')
RkBlog

Django, 14 July 2008,

Comment article