Obiekty Queryset w Django
Sporo rzeczy jest już na swoim miejscu: model Post
jest zdefiniowany w models.py
, w views.py
mamy post_list
, szablon też już gotowy. Ale jak to zrobić, aby nasze wpisy pojawiały się w szablonie HTML? Bo to właśnie chcemy osiągnąć: pobrać treści (czyli modele zapisane w bazie) i ładnie je wyświetlić w szablonie, prawda?
Dokładnie do tego przydadzą nam się widoki: do połączenia modeli i szablonów między sobą. W naszym widoku (view) post_list
musimy pobrać modele do wyświetlenia i przekazać je do szablonu. Innymi słowy, w naszym widoku decydujemy o tym, co (czyt. jaki model lub modele) zostanie wyświetlony w szablonie.
OK, zatem jak możemy to osiągnąć?
Musimy otworzyć nasz plik blog/views.py
. Jak dotąd widok post_list
wygląda następująco:
from django.shortcuts import render
def post_list(request):
return render(request, 'blog/post_list.html', {})
Pamiętasz, jak rozmawiałyśmy o dołączaniu kodu zapisanego w odrębnych plikach? Teraz jest przyszedł czas na dołączenie modelu, który napisałyśmy wcześniej w models.py
. Dodajmy wiersz from .models import Post
w następujący sposób:
from django.shortcuts import render
from .models import Post
Kropka po from
oznacza bieżący katalog lub biężącą aplikację. Jako że pliki views.py
i models.py
są w tym katalogu, możemy użyć po prostu .
i nazwy pliku (bez .py
). Następnie importujemy nazwę modelu (Post
).
Ale co dalej? Żeby pobrać wpisy naszego bloga z modelu Post
potrzebujemy czegoś, co nazywa się się QuerySet
.
QuerySet
Powinnaś być już zaznajomiona z zasadą działania obiektów typu QuerySet. Rozmawiałyśmy o tym w rozdziale Django ORM (QuerySets).
Więc teraz interesuje nas lista wpisów, które zostały opublikowane i posortowane według daty publikacji (published_date
), zgadza się? Już to zrobiłyśmy w rozdziale o QuerySetach!
Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
Teraz umieśćmy ten kod wewnątrz pliku blog/views.py
poprzez dodanie go do funkcji def post_list(request)
:
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {})
Zauważ, że tworzymy zmienną dla naszego QuerySetu: posts
. Potraktuj ją jako nazwę naszego QuerySetu. Od tej pory będziemy odnosić się do niej tylko za pomocą tej nazwy.
Ostatnią częścią, której nam brakuje, jest przekazanie QuerySetu posts
do szablonu (jej wyświetlaniem w szablonie zajmiemy się w następnym rozdziale).
W funkcji render
mamy już parametr request
(czyli wszystko to, co odbieramy od użytkownika przez internet) oraz plik szablonu 'blog/post_list.html'
. Ostatni parametr, który wygląda tak: {}
jest miejscem, w którym możemy dodać parę rzeczy do wykorzystania w szablonie. Musimy nadać im nazwy (ale póki co będziemy trzymać się nazwy 'posts'
:)). Powinno to wyglądać tak: {'posts': posts}
. Zauważ, że część przed :
jest zawarta w cudzysłowie ''
.
Zatem ostatecznie nasz plik blog/views.py
powinien wyglądać następująco:
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts})
I to wszystko! Czas, żebyśmy wróciły do naszego szablonu i wyświetliły ten QuerySet!
Jeżeli chciałabyś poczytać troszkę więcej na temat QuerySetów w Django, powinnaś rzucić okiem tutaj: https://docs.djangoproject.com/en/1.8/ref/models/querysets/