【问题标题】:Rendering tables in Django templates using JSON使用 JSON 在 Django 模板中呈现表
【发布时间】:2016-05-17 12:06:30
【问题描述】:

我目前正在研究我的 Django 应用程序的架构。 最终,我的目标是解析我从 Django 视图传递到模板的 JSON 对象:

观点:

tasks_queryset = TaskResponsiblePeople.objects.select_related('task')
tasks_json = serializers.serialize("json", tasks_queryset)
return render_to_response('task_management/task_list.html',
                          {'task_form':task_form,
                           'responsible_people_form':responsible_people_form,
                           'tasks_json':tasks_json},
                           context_instance=RequestContext(request))

模板:

<table stupid-attribute = {{tasks_json}}>
</table>

现在,我的问题是,有没有办法将参数传递给 Javascript,以便某些函数在不使用“愚蠢属性”的情况下在页面加载事件中呈现表格?我遇到了一个topic,它与我的问题非常相关,唯一的例外是我无法弄清楚

的含义

模板的 JavaScript 部分

具体来说,谁能说清楚,在我的代码中我应该在哪里使用

{% if tags %}
  var tagbs = {{ tags|safe }};
  var tgs = JSON.parse(tagbs);
  alert("done");
{% endif %}

从之前的讨论中,我可以使用 python 语法重写下面的代码,而不必像这样生成“脏”的 HTML:

for (var i = 0; i < data.length; i++) 
        {
            tr = $('<tr style = "cursor:pointer"/>');
            tr.append('<td><input class = "tableRowChecker" type="checkbox"></td>');

            if (data[i].fields.status == 1)
                tr.append("<td>" + 
                            " <div onclick = 'change_task_status(" + data[i].pk + ')' " +
                                " class='glyphicon glyphicon-ok'></div></td>");         
            else
                tr.append("<td>" +
                             "<div onclick = 'change_task_status(" + data[i].pk + " , false)' " +
                             " style = 'color:rgb(102,204,255)' class='glyphicon glyphicon-ok'></div></td>");                   
            $('#task_table tbody').append(tr);
        }

【问题讨论】:

    标签: javascript python json django templates


    【解决方案1】:

    我不知道你有什么问题,如果你用实际支持的属性 data 替换 stupid-attribute,但如果你确实想在其他地方包含它,你只需要添加一些实际的Javascript。

    <script type='text/javascript'>
        ... JSON code here ...
    </script>
    

    【讨论】:

    • 嗯,这里的关键是我希望脚本位于外部文件中。据我了解,如果我在模板文件中编写脚本,那么我将能够立即使用 Django 中的上下文变量。但是外部脚本呢
    • 我不确定你在说什么。您可以将您的 JSON 放在模板中的脚本 sn-p 中,并将脚本的其余部分放在外部 JS 文件中,如果这是您想要的。
    • 但似乎我不能在 JS 中使用 python 语法(比如,{% if tags %})。我只能在 HTML 中使用它。那这家伙怎么用 alert 呢?
    • 再一次,我不明白你的意思。您可以将 Django 语法放在 Django 模板中的任何位置。
    • 好的,丹尼尔,我已经知道了。非常感谢你对我的包容
    【解决方案2】:

    替代方法,是否需要javascript?如果我没看错,您有某种结构化数据并希望将其放入表中,这可能需要对 JSON 对象进行一些重塑,否则完全有可能。像这样的:

    传递某种 json 对象,如下所示:

    [
      {
        "task name": "first thing",
        "id": 1,
        "date": "01/01/2010"
      },
      {
        "task name": "second thing",
        "id": 2,
        "date": "02/02/2010"
      },
      {
        "task name": "third thing",
        "id": 3,
        "date": "03/03/2010"
      },
      {
        "task name": "fourth thing",
        "id": 4,
        "date": "04/04/2010"
      }
    ]
    

    然后在模板中,像这样:

    <thead>
        <tr>
            <th>Task</th>
            <th>ID</th>
            <th>Date</th>
        </tr>
    </thead>
    <tbody>
    {% for task in task_json %}
        <tr>
            <td>{{task.name}}</td>
            <td>{{task.id}}</td>
            <td>{{task.date}}</td>
        </tr>
    {% endfor %}
    </tbody>
    

    可能会遗漏一些东西,但这感觉它变得比需要的复杂得多。

    【讨论】:

    • 我试过你的解决方案,我的 json 看起来和这个完全一样(stackoverflow.com/questions/9592290/…)。奇怪的是,我的循环工作非常缓慢,并且呈现数百行而不是只有 20 行。
    • 你能发布 JSON 对象的样子吗?模板中的确切语法将取决于 JSON 的格式
    猜你喜欢
    • 2014-11-16
    • 2020-02-05
    • 2016-12-06
    • 2019-10-27
    • 2010-10-27
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多