Dinamikus adatok a template-ben

Az összetevőink különböző helyeken vannak: a Post modellt a models.py-ban definiáltuk, a post_list a views.py-ban van, és létrehoztunk egy sablont is. De mégis hogyan fogjuk megjeleníteni a bejegyzést a HTML sablonban? Mert pontosan ez az, amit szeretnénk: fogjuk a tartalmat (az adatbázisban elmentett modelleket) és szépen megjelenítjük a sablonunkban.

Pont ez az, amit a nézetek (views) csinálnak: összekötik a modelleket a sablonokkal. A post_list view-ba kell berakni a modelleket, amiket meg akarunk jeleníteni, és továbbítani a sablonba. Tehát a nézetben eldöntjük, hogy mi fog megjelenni a sablonban.

OK, hogyan fogjuk ezt megvalósítani?

Meg kell nyitni a blog/views.py fájlt. Eddig így nézett ki a post_list view:

from django.shortcuts import render

def post_list(request):
    return render(request, 'blog/post_list.html', {})

Emlékszel, amikor azt magyaráztuk, hogyan tudsz korábban megírt kódot beletenni más fájlokba? Most itt az alkalom, hogy beletegyük a modelt, amit a models.py-ba írtunk. A from .models import Post sort a következőképpen adjuk hozzá:

from django.shortcuts import render
from .models import Post

A pont a from után az aktuális könyvtárt, vagy az aktuális applikációt jelenti. Mivel a views.py és a models.py ugyanabban a könyvtárban vannak, elég annyit használnunk, hogy . és a fájl nevét (.py nélkül). Ezután importáljuk a model nevét.).

De mi jön ezután? Ahhoz, hogy megkapjuk az aktuális blog bejegyzést a Post modelből, szükségünk lesz valamire, amit QuerySet-nek hívnak.

QuerySet

Már ismerős lehet, hogy hogyan működik a QuerySet. A Django ORM (QuerySets) fejezetben már beszéltünk róla.

Most azok a bejegyzések érdekelnek minket, amik publikálva vannak és a published_date szerint vannak sorba rendezve. Ezt már megtettük a QuerySets fejezetben!

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

Most ezt a kódrészletet rakjuk a blog/views.py fájlba, hozzáadva a def post_list(request) function-hoz:

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

Figyeld meg, hogy létrehozunk egy változót a QuerySethez: posts. Vedd úgy, hogy ez a QuerySet neve. Innentől kezdve erre a névre hivatkozva használjuk.

Szintén fontos, hogy a kód a timezone.now() function-t tartalmazza, ehhez importálnunk kell a timezone-t.

Az utolsó hiányzó rész, hogy továbbítsuk a posts-ot a sablonba (ezt a következő fejezetben kifejtjük).

A render function-ban már van egy request paraméterünk (vagyis minden, ami a felhasználótól érkezik az interneten keresztül) és egy template file 'blog/post_list.html'. Az utolsó paraméter, ami így néz ki: {}, egy olyan összetevő, amiben megadhatjuk azokat a dolgokat, amiket használni fogunk a template-ben. El kell neveznünk őket (egyelőre ragaszkodunk a 'posts'-hoz :)). Így kell kinéznie: {'posts': posts}. Ne felejtsd el, hogy a : előtti rész egy string, ezt idézőjelbe kell tenned ''.

Végül a blog/views.py fájlnak így kell kinéznie:

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})

És megvan! Itt az idő visszatérni a template-hez és megjeleníteni ezt a QuerySet-et!

Ha utána szeretnél olvasni a QuerySet-nek, itt megteheted: https://docs.djangoproject.com/en/1.11/ref/models/querysets/

results matching ""

    No results matching ""