Предположим, что мой шаблон имеет в нем что-то как {% block subject %}my subject{% endblock %}
и я загружаю этот шаблон tmpl = loader.get_template('mytemplate.html')
, как я могу извлечь "свой предмет"?
Решение Camilo не работает, когда ваш шаблон расширяет базу. Я немного изменил его, чтобы (надеюсь) исправить эту проблему:
from django.template import Context
from django.template.loader import get_template
from django.template.loader_tags import BlockNode, ExtendsNode
def _get_node(template, context=Context(), name='subject'):
for node in template:
if isinstance(node, BlockNode) and node.name == name:
return node.render(context)
elif isinstance(node, ExtendsNode):
return _get_node(node.nodelist, context, name)
raise Exception("Node '%s' could not be found in template." % name)
Я действительно не уверен, что это правильный способ рекурсивного перебора всех узлов ... но он работает в моем ограниченном случае.
from django.template import Context
from django.template.loader import get_template
from django.template.loader_tags import BlockNode
t = get_template('template.html')
for node in t:
if isinstance(node, BlockNode) and node.name == 'subject':
print node.render(Context())
У меня это сработало, используя Django 1.1.1