【问题标题】:Django 1.6 - parse template tags after import/parse from viewDjango 1.6 - 从视图导入/解析后解析模板标签
【发布时间】:2015-04-18 16:32:28
【问题描述】:

首先,我对 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 %}

我尝试了几种不同的创可贴修复方法,但我更愿意了解如何正确执行此操作。我尝试过但可能被误解的一件事是,在返回渲染步骤之前:

def dataview(request):
  ...
  rendered = render_to_string('path/to/template12.html', context, context_instance=RequestContext(request))
  return render(request, 'path/to/template2.html'/, rendered)

感谢您的帮助。如果需要任何澄清,请告诉我!

【问题讨论】:

    标签: django templates render render-to-string


    【解决方案1】:

    您不必使用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 %}
    

    【讨论】:

    • 这正是我希望发现的,我错误地/不必要地使用了渲染。现在使用这种方法,效果很好。万分感谢!对于任何想知道的人,我的原始代码在 render_to_string 中多次调用相同的块 id,所以我现在正试图找出一种正确的方法来处理它(因为你只能调用每个唯一块一次)。但这是一个单独的问题。
    猜你喜欢
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2015-07-25
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多