Skip to content

Latest commit

 

History

History
executable file
·
75 lines (48 loc) · 3.82 KB

File metadata and controls

executable file
·
75 lines (48 loc) · 3.82 KB

Dynamická data v šablonách

Máme různé části na svém místě: Post model je definován v models.py, post_list máme v views.py a máme přidanou šablonu. Ale jak skutečně přinutíme naše příspěvky objevit se v naší HTML šabloně? Protože to je co chceme: Vzít nějaký obsah (modely uložené v databázi) a zobrazit je hezky v naší šabloně, správně?

To je přesně to, co views mají dělat: spojovat modely a šablony. Do našeho post_list view budeme potřebovat vzít modely které chceme zobrazit a předat je do šabloně. Takže v podstatě ve view se rozhodneme co (model) bude zobrazeno v šabloně.

OK, tak jak toho dosáhneme?

Potřebujeme otevřít blog/views.py. Prozatím post_list view vypadá takhle:

    from django.shortcuts import render

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

Vzpomínáš si, jak jsme mluvili o zahrnování kódu napsaného v různých souborech? Teď je ten moment kdy musíme zahrnout model který jsme napsali do models.py. Přidáme tuto řádku from .models import Post:

    from django.shortcuts import render
    from .models import Post

Tečka po from znamená aktuální adresář nebo aktuální aplikace. Protože se views.py a models.py nachází ve stejném adresáři, můžeme jednoduše použít . a jméno souboru (bez .py). Potom importujeme název modelu (Post).

Ale co dál? Abychom mohli vzít skutečné příspěvky z Post, potřebujeme něco, čemu říkáme QuerySet.

QuerySet

Už bys měla mít povědomí o tom jak QuerySety fungují. To jsme probrali v kapitole Django ORM (QuerySets).

Takže teď nás zajímá seznam příspěvků které jsou publikovány a setříděny podle published_date, že? To jsme už udělali v kapitole na QuerySety!

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

Teď tento kousek kódu vložíme do souboru blog/views.py do funkce 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 vědomí, že jsme vytvořili proměnnou pro QuerySet: posts. Považuj to za název našeho QuerySetu. Od teď k němu budeme referovat tímto názvem.

Kód také používá funkci timezone.now(), takže potřebujeme přidat import pro timezone.

Poslední chybějící část je předat posts QuerySet do šablony (jak ho zobrazit si ukážeme v další kapitole).

Ve funkci render už máme parametr request (všechno co přijmeme od uživatele přes internet) a šablonu 'blog/post_list.html'. Poslední parametr, který vypadá takhle: {} je místo, kam můžeme přidat nějaké věci, které chceme aby šablona mohla používat. Potřebujeme je pojmenovat (teď zůstaneme u 'posts' :)). Mělo by to vypadat takhle: {'posts': posts}. Všimni si, prosím, že část před : je string: musíš ho obalit uvozovkami ''.

A nakonec by náš blog/views.py soubor měl vypadat takhle:

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

A je to! Čas jít zpět do šablony a zobrazit tento QuerySet!

Pokud si chceš přečíst něco víc o QuerySetech v Django, měla by ses podívat sem: https://docs.djangoproject.com/en/1.8/ref/models/querysets/