2016-03-03 158 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 %}标签可以遍历它。