render_to_string

Функция render_to_string применяется для рендеринга шаблона с контекстом и возврата готовой HTML-строки без отправки HTTP-ответа. Она полезна, когда нужно сгенерировать HTML-код для email-писем, PDF-документов, AJAX-ответов или для вставки в другие шаблоны. Функция принимает путь к шаблону, словарь с контекстом и необязательные параметры, такие как запрос и среда рендеринга.

Синтаксис

pythonfrom django.template.loader import render_to_string

res = render_to_string(template_name, context=None, request=None, using=None)

Параметры функции render_to_string:

Пример

Давайте отрендерим шаблон с приветствием для пользователя:

pythonfrom django.template.loader import render_to_string

context = {
  'username': 'john_doe',
  'age': 25,
}

html_content = render_to_string('users/greeting.html', context)
print(html_content)

Содержимое шаблона 'users/greeting.html':

html<h1>Привет, {{ username }}!</h1>
<p>Ваш возраст: {{ age }} лет.</p>

Результат выполнения кода:

html<h1>Привет, john_doe!</h1>
<p>Ваш возраст: 25 лет.</p>

Пример

Давайте сгенерируем HTML-код для списка статей и отправим его в виде JSON-ответа:

pythonfrom django.template.loader import render_to_string
from django.http import JsonResponse
from myapp.models import Article

articles = Article.objects.filter(is_published=True)
context = {
  'articles': articles,
  'total': articles.count(),
}

html_result = render_to_string('articles/list_partial.html', context)

return JsonResponse({
  'html': html_result,
  'count': articles.count(),
})

Содержимое шаблона 'articles/list_partial.html':

html<ul>
  {% for article in articles %}
  <li>{{ article.title }}</li>
  {% endfor %}
</ul>
<p>Всего статей: {{ total }}</p>

Результат выполнения кода (JSON):

json{
  "html": "<ul>\n<li>Первая статья</li>\n<li>Вторая статья</li>\n</ul>\n<p>Всего статей: 2</p>",
  "count": 2
}

Пример

Давайте используем render_to_string для создания email-сообщения:

pythonfrom django.template.loader import render_to_string
from django.core.mail import send_mail

context = {
  'user': 'alex',
  'order_id': 12345,
  'total_price': 99.99,
}

email_body = render_to_string('emails/order_confirmation.html', context)

send_mail(
  subject='Подтверждение заказа',
  message='',
  from_email='shop@example.com',
  recipient_list=['user@example.com'],
  html_message=email_body,
)

Содержимое шаблона 'emails/order_confirmation.html':

html<h2>Заказ #{{ order_id }} подтвержден</h2>
<p>Здравствуйте, {{ user }}!</p>
<p>Сумма заказа: ${{ total_price }}</p>
<p>Спасибо за покупку!</p>

Результат выполнения кода (рендеринг шаблона):

html<h2>Заказ #12345 подтвержден</h2>
<p>Здравствуйте, alex!</p>
<p>Сумма заказа: $99.99</p>
<p>Спасибо за покупку!</p>

Смотрите также

  • функция render,
    которая рендерит шаблон и возвращает HttpResponse
  • функция reverse,
    которая возвращает URL-путь по имени маршрута
  • функция redirect,
    которая выполняет перенаправление на указанный URL
  • класс TemplateView,
    который рендерит шаблон на основе представления