Django 1.6 - 从视图 import/parse 之后解析模板标签
Django 1.6 - parse template tags after import/parse from view
首先,我对 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 为模板 2 中的上述 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 模板标签暴露为文本并且没有将图表显示定向到所需的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 %}
我已经尝试了几种不同的创可贴修复方法,但我只想了解如何正确地进行修复。我试过但可能误解的一件事是,在 return 渲染步骤之前:
def dataview(request):
...
rendered = render_to_string('path/to/template12.html', context, context_instance=RequestContext(request))
return render(request, 'path/to/template2.html'/, rendered)
感谢您的帮助。如果需要任何说明,请告诉我!
您不必使用 render
,它只是一个快捷方式,它采用 request
、模板名称和上下文,以及 returns 带有渲染上下文的 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
时,您的 blocks 和 extends 标签就不会被评估。例如
{% verbatim %}
{% extends template1.html %}
{% block main_content %}
{% endverbatim %}
{% for DATA in DATALIST %}
{{ DATA|safe }}
{% endfor %}
{% verbatim %}
{% endblock main_content %}
{% endverbatim %}
首先,我对 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 为模板 2 中的上述 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 模板标签暴露为文本并且没有将图表显示定向到所需的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 %}
我已经尝试了几种不同的创可贴修复方法,但我只想了解如何正确地进行修复。我试过但可能误解的一件事是,在 return 渲染步骤之前:
def dataview(request):
...
rendered = render_to_string('path/to/template12.html', context, context_instance=RequestContext(request))
return render(request, 'path/to/template2.html'/, rendered)
感谢您的帮助。如果需要任何说明,请告诉我!
您不必使用 render
,它只是一个快捷方式,它采用 request
、模板名称和上下文,以及 returns 带有渲染上下文的 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
时,您的 blocks 和 extends 标签就不会被评估。例如
{% verbatim %}
{% extends template1.html %}
{% block main_content %}
{% endverbatim %}
{% for DATA in DATALIST %}
{{ DATA|safe }}
{% endfor %}
{% verbatim %}
{% endblock main_content %}
{% endverbatim %}