【发布时间】:2019-09-13 21:28:32
【问题描述】:
如何使用 JavaScript 从我的 API 中获取数据?
我的目标是将我的模型数据可视化为图表或图形。对于可视化部分,我想选择 Charts.js。到目前为止,我能够在我的模板中显示一个带有给定默认数据的图表。现在我想将我的模型数据发送到我的模板并将其集成到 chart.js 中。据我了解,Chart.js 需要 JSON 格式。所以我用 Django REST 框架设置了一个 API,我得到了一个输出。
文件夹结构
visual # -- my project
├── cars # -- API
│ ├── templates
│ │ └── cars
│ │ └── cars_home.html
│ ├── <...>
│ ├── urls.py
│ ├── serializers.py
│ └── views.py
├── charts
├── static
│ ├── css
│ ├── img
│ └── js
│ ├── chart_2.js
│ └── <...>
├── templates
│ ├── base
│ │ └── base.html
│ └── includes
├── visual
│ ├── settings.py
│ ├── urls.py
│ └── views.py *db.sqlite3
└── manage.py
../汽车/urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from cars import views
from cars.views import CarsHomeView
app_name = 'cars'
urlpatterns = [
path('carshome/', CarsHomeView.as_view(), name='cars_home'),
path('cars/', views.SnippetList.as_view()),
path('cars/<int:pk>/', views.SnippetDetail.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)
这是我的 API 的输出:
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"count": 4,
"next": null,
"previous": null,
"results": [
{
"id": 3,
"name": "Audi",
"price": 11
},
{
"id": 4,
"name": "Audi",
"price": 11
},
{
"id": 2,
"name": "Mercedes",
"price": 22
},
{
"id": 1,
"name": "BMW",
"price": 99
}
]
}
这是原始输出
{"count":4,"next":null,"previous":null,"results":[{"id":3,"name":"Audi","price":11},{"id":4,"name":"Audi","price":11},{"id":2,"name":"Mercedes","price":22},{"id":1,"name":"BMW","price":99}]}
问题是如何使用 JavaScript 从我的 API 中获取数据?
我的方法是,首先简单地在我的模板中打印数据 - 检查它是否有效。另一件事是尝试两种不同的东西。一种是将 JavaScript 代码放在我的静态 /js 文件夹中的 extern 文件中。这至少适用于 Chart.js 和默认值。但是现在我还在我的模板中提供了 js 代码,因为当它在我的静态文件夹中时,js 可能有一些问题来引用我的 api。
所以这里是 template.html。我有来自教程站点的 JS 获取代码,不幸的是我找不到 django - js 示例。
../汽车/模板/汽车/cars_home.py
{% extends 'base.html' %}
{% load static %}
{% block content %}
<div class="container-fluid">
<div class="row">
<h1>Wellcome to Cars Home</h1>
</div>
<div class="row">
<!--via external js-->
<script src="{% static 'js/chart_2.js' %}"></script>
<!--via internal js-->
<script>
fetch('http://127.0.0.1:8000/cars/?format=json')
.then(response => {
return response.json()
})
.then(data => {
// Work with JSON data here
console.log(data)
})
.catch(err => {
// Do something for an error here
})
</script>
</div>
</div>
{% endblock content %}
另一个问题是,我的 API 输出中是否需要所有这些东西?
{"count":4,"next":null,"previous":null,"
我想如果它看起来像这样会更好吗?
"results":[{"id":3,"name":"Audi","price":11},{"id":4,"name":"Audi","price":11},{"id":2,"name":"Mercedes","price":22},{"id":1,"name":"BMW","price":99}]}
更新: 看来我在 Firefox 中的控制台出现了一些问题,并且没有显示数组和对象。我改用 Chrome 控制台,它向我展示了一切。
【问题讨论】:
标签: javascript json django django-rest-framework