2015-02-17 100 views
1

首先,我對Django比較陌生,所以請原諒我,如果我有一些基本的誤解。 我正在尋找解析一些Django模板標籤,這些標籤是作爲Django渲染的一部分導入的。我看到的最終問題是正確調用並顯示HTML/JS部分,但最後一個Django標記在頁面上呈現爲純文本。我意識到這是因爲我在一步之前渲染視圖太早,但我不知道如何正確地執行此操作。Django 1.6 - 導入/解析視圖後的模板標籤

這裏是基本的調用堆棧(簡化):

模板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:產生所需的Django/HTML用於在模板2上述數據列表

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

Python代碼:

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和JS罰款生成的HTML,但暴露出來的文字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) 

感謝您的幫助。請讓我知道是否需要澄清!

回答

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標籤,使您的模塊和擴展,當你第1模板調用render_to_string標籤不被評估。例如

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

這正是我希望找到的,我正在使用渲染不正確/不必要的。現在使用這種方法,它的工作很好。萬分感謝! 對於任何想知道的人來說,我的原始代碼在render_to_string中多次調用相同的塊ID,所以我試圖找出正確的方法來處理它(因爲您只能調用一次唯一的塊)。但這是一個單獨的問題。 – robeot 2015-02-18 02:20:14