【问题标题】:Django 1.9.3 - How to pass HTML template to index templateDjango 1.9.3 - 如何将 HTML 模板传递给索引模板
【发布时间】:2016-06-16 07:15:59
【问题描述】:

所以,我有索引模板,其中有一个表,它使用 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 %}

【问题讨论】:

  • 您需要提供更多细节。为什么不能在响应 Ajax 调用的视图中渲染模板片段?你为什么不想在那里传递任何上下文?
  • 我可以传递包含 HTML 表格的上下文。问题是,当索引模板接收到表时,我使用模板语言创建表(因为它非常简单),它会呈现所有内容,包括 {% for items in collection %} 例如。所以服务器没有解释 Python 代码。
  • 但这并没有回答我的问题:为什么不能在 Ajax 视图中呈现模板,就像在任何其他视图中一样?也许您应该显示该视图的完整代码。
  • 我确实做到了。我可以做到,但它确实包含 {{ }} 标签。
  • 我编辑了帖子以获取更多详细信息。

标签: python ajax django templates


【解决方案1】:

问题在于这段代码:

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

实际上只是将该模板代码放入一个字符串并将其作为 JSON 对象发送。模板代码在任何时候都不会转换为 HTML 字符串。

从您的 cmets 中,您暗示服务器不解释模板代码,但这是不正确的!肯定会涉及到 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 %} 标记可以循环通过它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-31
    • 2013-10-21
    • 2020-12-19
    • 1970-01-01
    • 2017-12-31
    • 2017-06-20
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多