javascript - 如何获取JS文件以从数据库中提取数据
问题描述
我是 Django 新手,正在做一个简单的项目,该项目涉及用户提交的表单,然后是仪表板页面,该页面提供一些漂亮的可视化图表来总结用户输入的数据。我正在为仪表板页面使用免费模板。它被创意蒂姆称为黑色仪表板。
在我的 HTML 模板中有以下内容
<canvas id="chartBig1"></canvas>
这我相信参考 JS 文件中有关要显示的图表的信息
下面是我认为 html 引用的 JS 文件的片段
var myChart = new Chart(ctxGreen, {
type: 'line',
data: data,
options: gradientChartOptionsConfigurationWithTooltipGreen
});
var chart_labels = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'];
var chart_data = [100, 70, 90, 70, 85, 60, 75, 60, 90, 80, 110, 100];
var ctx = document.getElementById("chartBig1").getContext('2d');
数据是静态的。使用我使用 models.py 保存的数据显示这些图表的最佳方式是什么。我可以将数据直接拉到JS文件中吗?
谢谢
解决方案
执行此操作的标准方法是创建一个 django 模板过滤器,将上下文变量转换为 json(根据设计,它是有效的有效 javascript 值文字):
from django.import template
from django.utils.safestring import mark_safe
import json
register = template.Library
@register.filter
def jsonval(val):
"""Output ``val`` as a (json) value suitable for assigning to variables in
javascript::
var js_var = {{ python_var|jsonval }};
"""
return mark_safe(json.dumps(val, sort_keys=True, indent=4))
这需要放在应用程序的 templatetags 文件夹中,通常在一个名为的文件中myapp_tags.py
(阅读有关在文档中创建自定义过滤器的更多信息:https ://docs.djangoproject.com/en/2.1/howto/custom-template-tags/ ) .
在您的模板中,您需要在使用之前加载过滤器:
{% load myapp_tags %}
....
var chart_data = {{ chart_data|jsonval }};
....
在您看来,您需要确保 chart_data 上下文变量是 json-serializable - 即。仅包含列表、字典、字符串、数字、布尔值和无(即没有 Django 查询集等)。json 文档包含有关绕过此限制的方法的信息,请参阅https://docs.python.org/3/library/json.html - 在“扩展 JSONEncoder”下;这可能需要在 js 端进行类似的解码步骤:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Using_the_reviver_parameter虽然这会使您的过滤器标签有点更复杂:
@register.simple_tag
def json_setup():
return """
var my_reviver = function (key, val) {
if (typeof val === 'string' && val.startsWith("@date:")) {
var dateval = val.slice("@date:".length);
return new Date(Date.parse(dateval));
}
return val; // else
};
"""
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.date):
return "@date:" + obj.isoformat() # e.g. "@date:2019-03-15"
if isinstance(obj, decimal.Decimal):
return float(obj)
# ..etc..
# Let the base class default method raise the TypeError
return json.JSONEncoder.default(self, obj)
@register.filter
def jsonval(val):
return mark_safe('JSON.parse("%s", my_reviver)' % json.dumps(val, cls=MyEncoder, sort_keys=True))
和你的模板:
{% load myapp_tags %}
{% json_setup %}
....
var chart_data = {{ chart_data|jsonval }};
....
推荐阅读
- git - 寻找包含有效 git 裸仓库的文件夹
- c++ - 从 URL 获取 IP (C++)
- r - R,如何在循环本身内增加 a for 循环限制?
- asp.net-core - 调用 RedirectToAction() 时如何用“+”替换“%2B”
- javascript - 在 ReactJS 组件中过滤 JSON 数组
- ansible - Ansible 问题:使用 ansible 将清单中的所有主机打印为列表并拒绝运行 playbook 的主机 IP?
- kubernetes - 服务请求通过 Kubernetes 的路径是什么?
- sql - 从已执行存储过程的可变大小结果集中返回所有列名
- jsp - 有没有办法做一个 if 语句来检查从数据库中的布尔值返回的值并基于它返回一个字符串?
- build - CMake交叉编译:如何根据目标架构链接库