Как расширить шаблон Django из строки Python - PullRequest
3 голосов
/ 29 июля 2011

У меня есть строка, похожая на

string '''
    <html>
        <head>
            {% block head %}{% endblock %}
            ... other stuff ...
        </head>
        <body>
            {% block body %}{% endblock %}
           ... other stuff ...
        </body>
    </html>
'''

Я бы хотел, чтобы следующий шаблон django унаследовал от указанной выше строки:

{% block head %}
    ... other stuff ...
{% endblock %}

{% block body %}
    <h1>Other stuff</h1>
{% endblock %}

Поскольку строка отсутствует в файлеa не может просто указать имя файла для движка рендеринга шаблонов.Есть идеи?

Ответы [ 2 ]

6 голосов
/ 29 июля 2011

Чтобы реализовать шаблонный расширитель только для строки, вам, вероятно, придется реализовать загрузчик шаблонов. На самом деле, гораздо более чистое решение - использовать предложение Threed, приведенное ниже.Передайте родительский элемент Template() в контексте, а не имя шаблона диска:

>>> from django.template import Context, Template
>>> extend_me = Template("Before A. {% block a %}{% endblock %}. After A")
>>> str_template = "{% extends parent %} {% block a %}This is inside A{% endblock %}"
>>> Template(str_template).render(Context({"parent": extend_me}))
u'Before A. This is inside A. After A'

К сожалению, это не работает на django 1.3, возможно, из-за ошибка # 7377 (Вы не можете использовать теги extends и block в шаблонах строк).Хотя он работает нормально в 1.2.Так что, если вы работаете с 1.3, вы можете посмотреть историю этого вопроса и использовать мой хак:)


Тег шаблона extends позволяет вам указать имя переменной(начиная с версии 1.0).

В этом вопросе есть пример его использования: Как использовать переменную расширения шаблона Django?

3 голосов
/ 30 июля 2011

Оказывается, есть еще более простой способ добиться этого:

from google.appengine.ext.webapp import template

parent = template.Template("<html><body>{% block content %}{% endblock %}</body></html>")
path = os.path.join(os.path.dirname(__file__), 'index.html')
template.render(path, template.Context({"baseTemplate": parent}))

Где файл index.html выглядит так:

{% extends baseTemplate %}
{% block content %}
    <h1>Hello World!</h1>
{% endblock %}

В этом случае объект шаблона(в отличие от просто строки) передается в контекст дочернего шаблона и используется в качестве переменной в теге extends.

...