Вложенные теги шаблонизатора Django

models.py:

class HTMLPage(models.Model):
    """Контент страниц"""
    url = models.TextField('URL страницы')
    title = models.TextField('Заголовок страницы')
    body = models.TextField('HTML-code')
    js = models.TextField('JavaScript-code')
    ctime = models.DateTimeField('Запись создана', default=timezone.now)

views.py:

class ShowPage(View):
    """Рендер страниц из БД"""

    @staticmethod
    def get(request, url: str = 'index.html'):
        """Получить страницу по URL"""
        context = {'page': HTMLPage.objects.filter(url=url).first(),
                   'nowtime': datetime.now().strftime('%Y:%m:%d %H:%M')}
        return render(request, 'index.html', context=context)

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>{{ page.title | safe }}</title>
</head>
<body>
{% if page.body %}
  {{ page.body | safe }}
{% else %}
  <h1>NOT FOUND</h1>
{% endif %}
</body>
</html>

Создадим объект HTMLPage:

page = HTMLPage()
page.url='index.html'
page.title='test'
page.body='<b>{{ nowtime }}</b>' # НЕ РАБОТАЕТ
page.save()

Если запустить это веб-приложение, то пройдя по пути http://127.0.0.1:8000/index.html мы увидим не время, а <b>{{ nowtime }}</b>

Как это исправить?

P.S. Пример полностью можно клонировать с https://gitlab.com/svmitin/djangoproject/


Ответы (1 шт):

Автор решения: svmitin

Нужно отредактировать views.py:

from django.views.generic.base import View
from django.template import Template, Context

from .models import HTMLPage


class ShowPage(View):
    """Рендер страниц из БД"""

    @staticmethod
    def get(request, url: str = 'index.html'):
        """Получить страницу по URL"""
        page = HTMLPage.objects.filter(url=url).first()
        nowtime = datetime.now().strftime('%Y:%m:%d %H:%M')

        template = Template(page.body)
        context = Context(dict(nowtime=str(nowtime)))
        body = template.render(context)

        context = {'page': page,
                   'nowtime': nowtime,
                   'body': body}
        return render(request, 'index.html', context=context)
→ Ссылка