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 %}
Другие вопросы по тегам