Dane dynamiczne w szablonach 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 właśnie to chcemy zrobić - pobrać trochę treści (modele zapisane w bazie danych) i ładnie je wyświetlić w naszym 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. W widoku view decydujemy, jaki (model) zostanie wyświetlony w szablonie.

OK, więc jak to osiągniemy?

Musimy otworzyć nasz plik blog/views.py w naszym edytorze kodu. Jak dotąd widok post_list wygląda następująco:

blog/views.py

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 moment, w którym musimy uwzględnić model, który napisałyśmy w models.py. Dodajmy wiersz from .models import Post w ten sposób:

blog/views.py

from django.shortcuts import render
from .models import Post

Kropka przed modelami models oznacza bieżący katalog lub bieżącą aplikację. views.py i models.py znajdują się w tym samym katalogu. Oznacza to, że możemy użyć . i nazwy pliku (bez .py). Następnie importujemy nazwę modelu (Post).

Ale co dalej? Aby pobrać aktualne posty na blogu z modelu Post, potrzebujemy czegoś, co nazywa się QuerySet.

QuerySet

Powinnaś być już zaznajomiona z zasadą działania obiektów typu QuerySet. Rozmawiałyśmy o tym w rozdziale ORM Django (obiekty QuerySets).

Więc teraz chcemy opublikować posty na blogu posortowane według daty publikacji (published_date), prawda? Zrobiłyśmy to już w rozdziale QuerySets!

blog/views.py

Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')

Teraz otwórz plik blog/views.py w edytorze kodu i umieść ten fragment kodu dodając go do funkcji def post_list (request), ale nie zapomnij najpierw dodać from django.utils import timezone:

blog/views.py

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', {})

Ostatnią częścią, której nam brakuje, jest przekazanie QuerySetu posts do szablonu. Nie martw się - omówimy sposób wyświetlania go w późniejszym rozdziale.

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.

W funkcji render mamy jeden parametr request (wszystko, co otrzymujemy od użytkownika za pośrednictwem Internetu) i inny podający 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}. Zwróć uwagę, że ta część przed : jest stringiem; powinnaś wziąć ją w cudzysłów:'.

Zatem ostatecznie nasz plik blog/views.py powinien wyglądać następująco:

blog/views.py

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ć trochę więcej na temat QuerySetów w Django, powinnaś rzucić okiem tutaj: https://docs.djangoproject.com/en/2.0/ref/models/querysets/

results matching ""

    No results matching ""