因爲近期須要熟悉Django、Echarts,所以經過本文記錄實現Django + Echarts 兩個小實例的過程,將分別使用不一樣方式實現Web端Echarts圖表的展現:javascript
pyecharts
展現3D圖echarts.js
展現折線圖環境+Django準備html
虛擬環境java
使用指定版本Python(本文使用python3.5
),建立名爲djangovenv
的虛擬環境python
$ virtualenv --python=/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 djangovenv
激活虛擬環境mysql
$ source ~/venv/djangovenv/bin/activate
安裝Django 1.11.4
、pyecharts
git
$ pip install django==1.11.4
$ pip install pyecharts
建立Django Project
、Django App
github
建立名爲mychartsite
的Projectsql
$ django-admin startproject myechartsite
$ cd my echartsite
建立名爲djoncharts
的app數據庫
$ python manage.py startapp djoncharts
myechartsite/settings.py
中註冊INSTALLED_ APPS = [ 'djoncharts', # <----在此添加 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
安裝django
$ pip install pyecharts
Demo製做(不與數據庫鏈接,直接來看一個官方樣例的效果,3D圖)
Step1: 在app目錄下設置myechartsite/djoncharts/urls.py
和myechartsite/djoncharts/views.py
首先,設置djoncharts/urls
,app命名空間有助於讓後續模板中{% url %}
標籤區分應該爲URL建立哪一個應用的視圖
# myechartsite/djoncharts/urls.py from django.conf.urls import url from . import views app_name = 'djoncharts' urlpatterns = [ url(r'^pyechart3d/$', views.pyechart3d, name='pyechart3d'), ]
以後,處理視圖(Views)功能部分,設置djoncharts/views
將pyecharts的官方案例寫入views:
# myechartsite/djoncharts/views.py from __future__ import unicode_literals from django.shortcuts import render import math from django.http import HttpResponse from django.template import loader from pyecharts import Line3D from pyecharts.constants import DEFAULT_HOST def pyechart3d(request): template = loader.get_template('djoncharts/pyecharts.html') l3d = line3d() context = dict( myechart=l3d.render_embed(), host=DEFAULT_HOST, script_list=l3d.get_js_dependencies() ) return HttpResponse(template.render(context, request)) def line3d(): _data = [] for t in range(0, 25000): _t = t / 1000 x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t) y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t) z = _t + 2.0 * math.sin(75 * _t) _data.append([x, y, z]) range_color = [ '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] line3d = Line3D("3D line plot demo", width=1200, height=600) line3d.add("", _data, is_visualmap=True, visual_range_color=range_color, visual_range=[0, 30], is_grid3D_rotate=True, grid3D_rotate_speed=180) return line3d
template = loader.get_template('djoncharts/pyecharts.html')
還找不到咱們的模板)首先,在app(/djoncharts
)目錄下,建立模板/templates
以及子目錄/templates/djoncharts
,在此子目錄下建立pyecharts.html
建立完成後的目錄結構爲:
├── __init__.py ├── admin.py ├── apps.py ├── tests.py ├── models.py ├── templates/ │ └── djoncharts/ │ └── pyecharts.html ├── views.py ├── migrations/ │ ├── __init__.py ├── urls.py
將下面 html 模板代碼保存爲pyecharts.html
,確保 pyecharts.html
文件的絕對路徑爲 myechartsite/djoncharts/templates/djoncharts
:
<!-- myechartsite/djoncharts/templates/djoncharts/pyecharts.html --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Proudly presented by PycCharts</title> {% for jsfile_name in script_list %} <script src="{{host}}/{{jsfile_name}}.js"></script> {% endfor %} </head> <body> {{myechart|safe}} </body> </html>
# myechartsite/urls.py from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^djoncharts/', include('djoncharts.urls')), ]
Step4: 運行項目
`$ cd myechartsite` `$ python manage.py runserver` 在瀏覽器輸入:`http://127.0.0.1:8000/djoncharts/pyecharts`
優勢在於可個性化靈活定製頁面。
Demo製做(不與數據庫鏈接,直接看一個官方樣例的效果,折線圖)
在上一個demo裏面,咱們已經在根目錄的URLconf設置了指向djoncharts的urlpatterns
, 所以不用管根目錄的urls
Step1: 在app目錄下的urls.py
中添加新的url(),綁定zhexian()
視圖函數:
# myechartsite/djoncharts/urls.py urlpatterns = [ ... url(r'^zhexian/$', views.zhexian, name='zhexian'), ]
Step2: 在views.py
中添加zhexian()
視圖函數:
# myechartsite/djoncharts/views.py def zhexian(request): return render(request, 'djoncharts/zhexian.html')
Step3: 導入echarts.js
並添加模板zhexian.html
首先,導入echarts.js
:建立目錄static/djoncharts/js
,複製echarts.js
至目錄下(確保echarts.js
在絕對路徑/myechartsite/djoncharts/static/djoncharts/js/echarts.js
下)
以後,添加模板,將如下代碼寫入templates/djoncharts/zhexian.html
:
{% load static %} <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- 引入 ECharts 文件 使用 static 關鍵字--> / <script src="{% static 'djoncharts/js/echarts.js' %}"></script> </head> </html> <body> <!-- 爲 ECharts 準備一個具有大小(寬高)的 DOM --> <div id="main" style="width:1280px;height:850px;"></div> <script type="text/javascript"> // 基於準備好的dom,初始化echarts實例 var myChart = echarts.init(document.getElementById('main')); // 指定圖表的配置項和數據 var option = { title: { text: 'Step Line' }, tooltip: { trigger: 'axis' }, legend: { data:['Step Start', 'Step Middle', 'Step End'] }, grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, toolbox: { feature: { saveAsImage: {} } }, xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { name:'Step Start', type:'line', step: 'start', data:[120, 132, 101, 134, 90, 230, 210] }, { name:'Step Middle', type:'line', step: 'middle', data:[220, 282, 201, 234, 290, 430, 410] }, { name:'Step End', type:'line', step: 'end', data:[450, 432, 401, 454, 590, 530, 510] } ] }; // 使用剛指定的配置項和數據顯示圖表 myChart.setOption(option); </script> </body>
Step4: 運行項目
$ cd myechartsite
$ python manage.py runserver
在瀏覽器輸入:http://127.0.0.1:8000/djoncharts/zhexian
3.1 如何操做數據庫(兩種方式)
1 執行cursor()
cur = connections['databasename'].cursor() cur.execute(''' SQL語句 ''') # 轉換成dataframe df = pd.DataFrame(list(cur.fetchall()), columns=['name','song'])
2 經過模型,操做模型
安裝pymysql
python3.5
不支持MySQL-python
因此須要換成pymysql
安裝後在/myechartsite/myechartsite/__init.py
下輸入
import pymysql pymysql.install_as_MySQLdb()
準備models
--database=
來指定一個。所以使用$ python manage.py inspectdb --database=yourdatabasename
查看相應的數據庫表的模型$ python manage.py inspectdb --database=afant_stat_db > djoncharts/models.py
將模型文件寫入對應app下的models.py
文件3.2 在視圖函數中測試執行SQL語句時候報錯
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myechartsite.settings")
3.3 template中如何取dict值
{% for key, value in dict.items %}
3.4 template中dict沒法排序問題,
{{ for key, value in dict.items|dictsort:0 }}
針對給定的index (此處是0,因此就是依據key) 進行過濾<body> {% for k, v in pre_stat.items|dictsort:0 %} {% if k %} {{ k }} {{ v }} {% else %} <p> nothing to show </p> {% endif %} {% endfor %} </body>
(另外也可自行寫templatetag函數來進行dict過濾)