Django 1.6 - 从视图导入/解析后解析模板标签

时间:2015-02-17 20:35:35

标签: django templates render render-to-string

首先,我对Django来说比较新,所以请原谅我,如果我有一些根本的误解。 我正在寻找解析一些Django模板标签,这些标签作为Django渲染的一部分导入。我看到的最终问题是正确调用和显示HTML / JS部分,但最后的Django标记在页面上呈现为纯文本。我意识到这是因为我过早地在一步之前渲染了视图,但我不确定如何正确地进行此操作。

这是基本的调用堆栈(简化):

模板1

{% 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 %}

模板2:

{% extends template1.html %}
{% block main_content %}
{% for DATA in DATALIST %}
    {{ DATA|safe }}
{% endfor %}
{% endblock main_content %}

python代码,为template2中的上述DATALIST生成所需的Django / HTML:

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

将上面的python传递给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模板标签作为文本公开,并没有将chartdisplay指向所需的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 个答案:

答案 0 :(得分:2)

您不必使用render,它只是一个获取request模板名称和上下文的快捷方式,并返回带有渲染上下文的http响应。

在这种情况下,这不是你想要的。您有一个要渲染的模板字符串rendered。用于呈现模板的低级API在文档中解释为here

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 %}