Динамічні дані в шаблонах

Маємо різні шматочки на своїх місцях: модель Post визначено в models.py, маємо post_list у views.py, а також відповідний шаблон. Однак, яким чином ми змусимо наші пости з'явитися в HTML шаблоні? Оскільки це те, чого ми хочемо: взяти деякий контент (моделі збережені в базі даних) і вивести його в гарному вигляді на нашому шаблоні, правда ж?

Це саме те, що покликані робити відображення: з'єднаємо моделі і шаблони. В нашому відображенні post_list нам потрібно взяти моделі, які ми хочемо зобразити, і передати їх до шаблону. Отже, в основному, у секції відображення - view ми вирішуємо що (модель) буде виведено в шаблоні.

Добре, отже як ми цього досягнемо?

Нам треба відкрити наш blog/views.py. Таким чином, відображення post_list виглядає на кшталт:

from django.shortcuts import render

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

Пам'ятаєте, як ми говорили про включення коду написаного в різних файлах? Тепер настав момент, коли ми повинні включити модель написану в models.py. Додаймо рядок from .models import Post:

from django.shortcuts import render
from .models import Post

Крапка після from означає поточна директорія або поточний додаток. Оскільки views.py і models.py розташовані в одній і тій же папці, можемо просто використовувати . і ім'я файлу (без .py). Далі імпортуємо ім'я моделі (Post).

А що далі? Щоб вилучити реальні пости з моделі Post, нам потрібна певна річ, що називається QuerySet.

QuerySet

Ви маєте вже бути ознайомлені із роботою QuerySets. Ми говорили про це у розділі Django ORM (QuerySets).

Отже, наразі ми зацікавлені у списку опублікованих і відсортованих за параметром published_date блог постів, чи не так? Ми вже робили це у розділі QuerySets!

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

А тепер вставимо цей шматок коду у файл blog/views.py додавши його до функції 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', {})

Зазначте, будь ласка, що ми створюємо змінну для нашого QuerySet: posts. Сприймайте її як ім'я для QuerySet. З цього моменту ми можемо посилатися на неї через це ім'я.

Крім того, код використовує функцію timezone.now(), а значить, ми повинні імпортувати timezone.

Остання пропущена частина - передача QuerySet posts шаблону (розглянемо, як це вивести в наступному розділі).

У функції render ми вже маємо параметр request (тобто усе, що ми отримуємо від користувача через Інтернет) і файл шаблону 'blog/post_list.html'. Останній параметр, котрий виглядає як: {} - це місце, в якому ми можемо додавати певні речі для використання у шаблоні. Ми повинні дати їм імена (ми обмежились ім'ям 'posts' наразі :)). Це має виглядати як: {'posts': posts}. Прохання звернути увагу, що частина перед : є рядком; вам необхідно взяти це у лапки ''.

Отже, врешті-решт наш файл 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})

Це все! Час повернутись назад до нашого шаблону і вивести QuerySet!

Якщо бажаєте дізнатись трохи більше про QuerySets в Django, зазирніть сюди: https://docs.djangoproject.com/en/1.11/ref/models/querysets/

results matching ""

    No results matching ""