Dynamické dáta v šablónach

Máme rozdielne kúsky na svojom mieste: Post model je definovaný v models.py, máme post_list v views.py a pridanú šablónu. Ale ako prinútime HTML šablónu, aby zobrazovala náš príspevok? Pretože to je to, čo chceme: vziať nejaký obsah (modely uložené v databáze) a zobraziť ich pekne v našej šablóne, že?

To je presne to, čo majú views robiť: spojiť modely a šablóny. V našom post_list view potrebujeme vziať modely ktoré chceme zobraziť a posunúť ich do šablóny. Takže sa v podstate rozhodneme vo view čo (model) bude zobrazené v šablóne.

Dobre, takže ako to dosiahneme?

Musíme otvoriť náš blog/views.py. Zatiaľ post_list view vyzerá takto:

from django.shortcuts import render

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

Pamätáš si, keď sme rozprávali o zahrnutí kódu napísanom v rozdielnych súboroch? Teraz nastal čas kedy musíme zahrnúť model, ktorý sme napísali v models.py. Pridáme tento riadok from .models import Post takto:

from django.shortcuts import render
from .models import Post

Bodka za from znamená aktuálna zložka alebo aktuálna aplikácia. Pretože views.py a models.py sú v rovnakej zložke, môžeme jednoducho použiť . a meno súboru (bez .py). Potom importujeme názov modelu (Post).

Ale čo ďalej? Na to aby sme boli schopní vziať konkrétny príspevok blogu z Post modelu potrebujeme niečo, čo sa volá QuerySet.

QuerySet

Už by si mala vedieť ako funguje QuerySets. Hovorili sme o tom v kapitole Django ORM (QuerySets).

Takže teraz máme záujem o zoznam príspevkov blogu, ktoré sú uverejnené a zoradené podľa published_date, však? To sme už spravili v kapitole QuerySets!

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

Teraz vložíme tento kus kódu do súboru blog/views.py pridaním do funkcie 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', {})

Vezmi prosím na vedomie, že vytvárame premennú pre náš QuerySet: posts. Považuj to za meno nášho QuerySetu. Odteraz ho môžeme referovať pod týmto menom.

Taktiež, kód používa funkciu timezone.now(), takže musíme pridať import pre timezone.

Posledná chýbajúca časť je predanie posts QuerySetu do šablóny (v nasledujúcej kapitole si ukážeme ako ju zobraziť).

V render funkcii už máme parameter request (takže všetko čo príjmeme od užívateľa cez Internet) a súbor šablóny 'blog/post_list.html'. Posledný parameter, ktorý vyzerá takto: {} je miesto na ktoré môžeme dať nejaké veci ktoré môže použiť šablóna. Potrebujeme im dať mená (zatiaľ sa budeme držať 'posts' :)). Malo by to vyzerať takto: {'posts': posts}. Všimni si, že časť pred : je reťazec: potrebuješ ju obaliť do úvodzoviek ''.

Nakoniec by náš súbor blog/views.py mal vyzerať takto:

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

To je všetko! Čas prejsť na našu šablónu a zobraziť tento QuerySet!

Pokiaľ si chceš prečítať niečo viac o QuerySets v Djangu mala by si sa pozrieť sem: https://docs.djangoproject.com/en/1.8/ref/models/querysets/

results matching ""

    No results matching ""