Django 5 для начинающих

Прогресс по курсу:  9/1004

2.6 Шаблоны, часть 1.
5 из 13 шагов пройдено
0 из 36 баллов  получено

Однако в проекте Django нередко бывает несколько приложений. И каждое из этих приложений может иметь свой набор шаблонов. Чтобы разграничить шаблоны для отдельных проектов, можно создавать для шаблонов каждого приложения отдельный каталог.

Например, в нашем случае у нас одно приложение и наш проект выглядит так:


И чтобы использовать более правильный подход к проектированию проекта обычно внутри папки шаблонов создают папку с названием нашего приложения:


Тем самым у нас есть общая папка для шаблонов, в которой уже разделены все шаблоны приложений по папкам.

При этом файл settings.py можно не трогать, а лишь изменить нашу функцию в файле views.py на:

from django.shortcuts import render


def index(request):
    return render(request, "blog/index.html")

PyCharm Professional Edition автоматически отслеживает изменения пути шаблонов, и он автоматически изменит путь в представлениях. Стоит отметить, что теперь в пути к шаблону страницы указывается и папка, в которой он находится: blog/index.html.

Класс TemplateResponse

В предыдущем шаге для (вызова) шаблона применялась функция render(), что является наиболее распространенным вариантом. Однако мы также можем использовать класс TemplateResponse (шаблонный ответ).


Функция index() при использовании класса TemplateResponse будет выглядеть следующим образом:

from django.template.response import TemplateResponse


def index(request):
    return TemplateResponse(request, "blog/index.html")

Результат работы приложения с использованием класса TemplateResponse будет таким же, как и при использовании функции rеndеr().


Итак, мы научились создавать шаблоны НТМL-страниц и возвращать их в виде ответов пользователю на их запросы. Но в приводимых примерах мы, по сути, возвращали пустые страницы, что конечному пользователю не совсем интересно. Он
ожидает получить в ответ какую-то полезную информацию. То есть веб-приложение должно уметь заполнить шаблон страницы теми данными, которые запросил пользователь. В следующих шагах мы попробуем решить эту задачу.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Основная разница между классом TemplateResponse и функцией render() заключается в том, что TemplateResponse откладывает рендеринг шаблона до тех пор, пока представление не будет завершено. Это позволяет любому промежуточному программному обеспечению для ответа шаблона (template response middleware) работать с ответом и потенциально изменять шаблон или данные контекста перед рендерингом шаблона. После того как промежуточное программное обеспечение для ответа шаблона будет выполнено, шаблон будет отрендерен, а обычное промежуточное программное обеспечение для ответа будет выполнено на отрендеренном контенте перед тем, как ответ будет возвращен клиенту.

Функция render(), напротив, немедленно рендерит шаблон и возвращает объект HttpResponse. Это означает, что промежуточное программное обеспечение для ответа шаблона не может работать с ответом, и данные контекста не могут быть изменены после рендеринга шаблона.

Вот пример использования класса TemplateResponse:

from django.http import HttpResponse
from django.template import loader

def my_view(request):
    # Создаем объект TemplateResponse
    response = TemplateResponse(request, loader.get_template('my_template.html'))

    # Добавляем данные контекста
    response.context['my_variable'] = 'Hello, world!'

    return response

В этом примере объект TemplateResponse создается с помощью метода get_template() класса Loader. Затем к объекту TemplateResponse добавляются данные контекста с помощью метода context. Наконец, объект TemplateResponse возвращается из представления.

Вот пример использования функции render():

def my_view(request):
    # Рендерим шаблон и возвращаем объект HttpResponse
    return render(request, 'my_template.html', {'my_variable': 'Hello, world!'})

В этом примере шаблон рендерится и возвращается объект HttpResponse. Данные контекста передаются в функцию render() в виде словаря.

В целом, класс TemplateResponse обеспечивает большую гибкость и контроль над процессом рендеринга шаблона. Функция render() более проста в использовании, но может быть менее гибкой.

@Anonymous_450292901, ваш пример не работает на этой версии джанго!

 

from django.http import HttpResponse
from django.template import loader

def my_view(request):
    # Создаем объект TemplateResponse
    response = TemplateResponse(request, loader.get_template('my_template.html'))

    # Добавляем данные контекста
    response.context['my_variable'] = 'Hello, world!'

    return response

@Anonymous_450292901, такой код уже работает!

 

def my_view(request):
    # Создаем объект TemplateResponse
    response = TemplateResponse(request, loader.get_template('blog/profile.html'))

    # Проверяем, что context_data не является None
    if response.context_data is None:
        response.context_data = {}

    # Добавляем данные контекста через метод context_data
    response.context_data['my_variable'] = 'Hello, world!'

    return response

@Anonymous_450292901, ого, мощно))
короче лучше использовать TemplateResponse)

@Anonymous_450292901, Отлично подметили, спасибо, надеюсь дальше по курсу это будет)