Django 1.6 - разбирать теги шаблонов после импорта / разбирать из вида
Во-первых, я относительно новичок в Django, так что прости меня, если есть какое-то фундаментальное недоразумение с моей стороны. Я пытаюсь разобрать некоторые теги шаблонов Django, которые импортированы как часть рендера Django. Конечная проблема, которую я вижу, состоит в том, что части HTML/JS правильно вызываются и отображаются, но последние теги Django отображаются на странице в виде простого текста. Я понимаю, что это потому, что я делаю вид раньше, чем на шаг раньше, но я не уверен, как правильно это сделать.
Вот основной стек вызовов (упрощенно):
template1
{% extends base.html %}
{% block main_content %}
{{ block.super }}
<div id="col1" class="chart-col" style="float: left; width: 33%;">
{% block col1 %}
{% endblock col1%}
{% endblock main_content %}
template2:
{% extends template1.html %}
{% block main_content %}
{% for DATA in DATALIST %}
{{ DATA|safe }}
{% endfor %}
{% endblock main_content %}
код Python, который генерирует желаемый Django / HTML для вышеуказанного DATALIST в template2:
def chartdisplay(block_var, othervars):
text = "{% block block_var %} \n {{ block.super }} \n"
text += "<html to generate data display goes here>"
text += "{% endblock block_var %}
return text
вышеупомянутый питон передается в Django View.py:
def dataview(request):
datapull = model.object.filter(**kwargs) #generic data pull
#date-time handler
dthandler = lambda obj: (
obj.isoformat()
if isinstance(obj, datetime.datetime)
or isinstance(obj, datetime.date)
else obj)
data = {'data': datapull}
chart_html = [
chartdisplay(block_var="col1", other_unique_vars),
chartdisplay(block_var="col2", other_unique_vars),
chartdisplay(block_var="col2", other_unique_vars),
chartdisplay(block_var="col3", other_unique_vars)
]
context = {'data', jsondump(data, default=dthanlder), 'charts': charts_html)
return render(request, 'path/to/template2.html', context)
Теперь главная проблема заключается в том, что отображаемый HTML-код отображает HTML и JS в порядке, но теги шаблона Django отображаются в виде текста и не направляют отображение диаграммы в нужные элементы div. Например, template2.html рассматривается как:
{% block col1 %} {{ block.super }}
<html/D3 chart is displayed fine>
{% endblock col1 %}
{% block col2 %} {{ block.super }}
<html/D3 chart is displayed fine>
{% endblock col2 %}
{% block col2 %} {{ block.super }}
<html/D3 chart is displayed fine>
{% endblock col2 %}
{% block col3 %} {{ block.super }}
<html/D3 chart is displayed fine>
{% endblock col3 %}
Я перепробовал несколько различных исправлений, но лучше понять, как это сделать правильно. Единственное, что я пробовал, но, вероятно, неправильно, до шага обратного рендеринга:
def dataview(request):
...
rendered = render_to_string('path/to/template12.html', context, context_instance=RequestContext(request))
return render(request, 'path/to/template2.html'/, rendered)
Спасибо за помощь. Пожалуйста, дайте мне знать, если какие-либо разъяснения необходимы!
1 ответ
Вам не нужно использовать render
Это просто ярлык, который занимает request
, имя шаблона и контекст, и возвращает http-ответ с визуализированным контекстом.
Это не то, что вы хотите в этом случае. У вас есть шаблон строки rendered
что вы хотите сделать. Низкоуровневый API для рендеринга шаблона описан здесь в документации.
from django.template import Context, Template
from django.http import HttpResponse
def dataview(request):
...
rendered = render_to_string('path/to/template2.html', context)
template = Template(rendered)
return HttpResponse(template.render(Context(context)))
Возможно, вам придется использовать verbatim
тег, чтобы ваши блоки и расширяет теги не оцениваются при вызове render_to_string
на первом шаблоне. Например
{% verbatim %}
{% extends template1.html %}
{% block main_content %}
{% endverbatim %}
{% for DATA in DATALIST %}
{{ DATA|safe }}
{% endfor %}
{% verbatim %}
{% endblock main_content %}
{% endverbatim %}