繁体   English   中英

django 将数据传递给 javascript 的最佳方式

[英]django best way to pass data to javascript

在我发现数据绑定库之前,我曾经将我的数据“绑定”到 DOM。 我的问题是,假设我有一个包含模型记录的表,我如何使用 JS 构建该表,即将对象传递给 javascript 而不是直接在模板中构建表?

到目前为止,我发现的唯一方法是这样的:

var data = '{{data}}';  

{{data}}可以是这个例子的 json。

将模板代码放在 javascript 中,这对我来说似乎既丑陋又糟糕,而且我也不喜欢在 javascript 中使用全局变量的想法(旧方式,它不能很好地扩展)。 它也不允许我把它放在外部 JS 文件中。 有没有更好(和干净)的方法?

django 模板自动转义所有标签 {{ }}。

如果 table_data 已经是模板标签中的 json 数据。 简单。

<script>
var myTable = {% autoescape off %}{{ table_data }}{% endautoescape %};
</script>

不需要括号和引号,它是javascript中的数组(例如var example = ['test'];)

如果数据不是 json,则在请求中返回它(渲染模板)。 示例

import json
from django.shortcuts import render

def home(request):
    table_data = MyModel.objects.select_related().values('items1', 'items2')
    return render(
        request, 
        'main.html', 
        {
          'table_data': json.dumps(list(table_data))
        }) 

我也是这样做的,但是我没有传递太多数据,只传递了一些我需要初始化 JS 代码的参数。 主要数据通过 API 传递。

如果需要,您可以传递 json,但至少可以在使用escapejs在模板中渲染data之前清理data

var data = '{{data|escapejs}}';

希望这有帮助

有多种方法可以将预加载的序列化数据与其余代码巧妙地隔离开来。

示例 1 —将预加载的数据分配给window上的全局变量,然后在您的表组件中使用它:

<html>
<meta charset="utf-8">
<body>
    <script>
        // Loading the data for use in JS components here
        (function () {
            window.tableData = JSON.parse('{{ table_data }}');
        }());
    </script>

    <script src="table.js"></script>
    <!-- table.js uses window.tableData when building the table -->
</body>

示例2——将table组件封装为一个模块,从主模板初始化,并传递预加载的数据。

<html>
<meta charset="utf-8">
<body>
    <table id="theTable"></table>

    <script src="table.js"></script>
    <!-- table.js exports itself globally as window.table -->

    <script>
        // Loading the data and initializing table component
        (function () {
            var tableEl = $('#theTable');
            var tableData = JSON.parse('{{ table_data }}');

            window.table.init(tableData, tableEl);
        }());
    </script>
</body>

等等!

想要完全避免将 Django 模板语言和 JavaScript 混用吗?

  • 通过 XHR 传递所有数据——在页面加载后向服务器发出 AJAX 请求; 编写一个 Django 视图,将您需要的数据作为 JSON 返回,这在 JavaScript 中很容易解析。

想要一切——不要使用 Django 模板语言避免额外的 XHR 来获取数据?

  • 考虑在 React.js 或 AngularJS 等框架上构建您的应用程序,并利用组件的服务器端渲染。

我遇到了同样的问题,这就是我解决它的方法

在 views.py 文件中

context = {'data': json.dumps (data)}
return render (request, 'demo / home.html', context)

块引用

在你的 html

var data = JSON.parse ("{{data | escapejs}}");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM