Django 1.9.3 - 如何将HTML模板传递给索引模板

时间:2016-03-03 05:42:42

标签: python ajax django templates

所以,我有索引模板,在那里我有一个表使用Django模板语言来创建一个表(使用for)。

如何使用AJAX将相同的表(即使使用Django模板代码)传递给索引模板?我已经添加了AJAX部分并且它可以工作,但是DJango代码没有被解释而且表格没有构建。

基本上,我想:

  • 在"模板中分离单个DOM组件"所以通过AJAX,我根据需要推送到主(索引)模板。请记住这些"模板"应该包含像{% 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 %}

1 个答案:

答案 0 :(得分: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,以编程方式演示使用模板,以及使用Context对象提供其他信息。

也许更好的选择是将模板代码留在某处的部分模板文件中。例如,假设您已创建包含以下模板代码的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加载模板代码,并使用提供的dict动态创建上下文。在这种情况下,Context中的items条目设置为一个数组,以便{% for %}标记可以遍历它。