2016-03-03 184 views
3

因此,我有索引模板,並且在那裏我有一個使用Django模板語言創建表(使用for)的表。Django 1.9.3 - 如何將HTML模板傳遞給索引模板

如何通過AJAX將相同的表(即使使用Django模板代碼)傳遞給索引模板?我已經添加了AJAX部分並且它可以工作,但是DJango代碼沒有被解釋並且表格沒有被構建。所以通過AJAX我推到主(指數)模板根據需要在「模板」

  • 分隔各個DOM組件:

    基本上,我想。請記住,這些「模板」應該包含類似{% for item in data %}的Django代碼。

例如:

從視圖:

def getDetails(request): 
var = "{% if 10 > 5 %}<h1>TRUE</h1>{% endif %}" 
return HttpResponse(
      json.dumps(var), 
      content_type="application/json" 
     ) 

的index.html:

function getDetails() { 
    $.ajax({ 
     url : "getDetails/", 
     type : "POST", 
     data : { getDetails : $('#postValue').val() }, 

     success : function(json) { 
      $('#postValue').val(''); 
      $("#tableDetails").html(json) 

    <div id="tableDetails"></div> 

什麼瀏覽器顯示:

{% if 10 > 5 %} 
TRUE 
{% endif %} 
+0

你需要給一點細節。爲什麼不能在響應Ajax調用的視圖中呈現模板片段?你爲什麼不想通過任何背景? –

+0

我可以傳遞包含HTML表格的上下文。問題是,當我使用模板語言創建表格時(因爲它非常簡單),當索引模板接收到表格時,它將呈現所有內容,包括{%for items in collection%})。所以服務器沒有解釋Python代碼。 – Portu

+0

但是這並沒有回答我的問題:爲什麼你不能在Ajax視圖中渲染模板,就像你使用其他視圖一樣?也許你應該展示該視圖的完整代碼。 –

回答

4

釷Ë問題是,這種代碼:

def getDetails(request): 
    var = "{% if 10 > 5 %}<h1>TRUE</h1>{% endif %}" 
    return HttpResponse(
    json.dumps(var), 
    content_type="application/json" 
) 

真的只是把那個模板的代碼轉換成字符串並且將其作爲一個JSON對象。模板代碼從未被轉換爲HTML字符串。

從您的意見,你意味着服務器不解釋模板代碼,但這是不正確的! Django的默認視圖肯​​定會涉及到。

您可以使用Template類自己做這個解釋。

嘗試以下代碼:

from django.template import Context, Template 
template = Template("{% if 10 > 5 %}<h1>{{ value }}</h1>{% endif %}") 

def getDetails(request): 
    context = Context({"value": "TRUE"}) 
    output = template.render(context) 
    return HttpResponse(
    json.dumps(output), 
    content_type="application/json" 
) 

上面的例子,改編自the Django 1.9 documentation,表明編程方式使用一個模板,以及提供使用上下文對象的附加信息。


也許是更好的選擇是離開你的模板代碼在部分模板文件中的某個地方。例如,假設您已經創建table.html包含以下模板代碼:

<table> 
{% for item in items %} 
    <tr><td>{{ item }}</td></tr> 
{% endfor %} 
</table> 

然後,你可以加載和渲染它,如下所示:

from django.template.loader import render_to_string 

def getDetails(request): 
    table_rows = ['item 1', 'item 2', 'item 3'] 
    output = render_to_string("table.html", {"items": table_rows}) 
    return HttpResponse(
    json.dumps(output), 
    content_type="application/json" 
) 

render_to_string這調用將從table.html加載模板代碼,並使用提供的字典動態創建上下文。在這種情況下,上下文中的items條目被設置爲一個數組,以便{% for %}標籤可以遍歷它。