1、項目創建 2、添加常用文件夾 一般名稱為static與templates,在新版本中需要手動添加,static用於靜態資源,templates用於存放模板文件。以下是創建好之後的目錄,註意在新建的項目testsite目錄(上面創建時使用的名稱)下麵,還會有一個testsite文件夾。 3、一個用 ...
1、項目創建
# 新建一個文件夾DjangoProjects
# 切換到需要的文件夾創建虛擬環境 C:\Projects\DjangoProjects>python -m venv test_venv
# 激活虛擬環境 C:\Projects\DjangoProjects>test_venv\Scripts\activate.bat
# 激活後會在前面添加虛擬環境作為首碼,如下所示
(test_venv) C:\Projects\DjangoProjects>
# 安裝django,會安裝到虛擬環境的site-packages中 (test_venv) C:\Projects\DjangoProjects>pip3 install django # 新建項目 (test_venv) C:\Projects\DjangoProjects>django-admin.py startproject testsite # 這時就可以啟動開發伺服器了,註意先切換到項目文件夾 (test_venv) C:\Projects\DjangoProjects>cd testsite (test_venv) C:\Projects\DjangoProjects\testsite>python manage.py runserver # 創建應用 (test_venv) C:\Projects\DjangoProjects\testsite>python manage.py startapp testblog
2、添加常用文件夾
一般名稱為static與templates,在新版本中需要手動添加,static用於靜態資源,templates用於存放模板文件。以下是創建好之後的目錄,註意在新建的項目testsite目錄(上面創建時使用的名稱)下麵,還會有一個testsite文件夾。
3、一個用於說明如何使用django的例子
結合上面創建的目錄和應用,這個例子會顯示如何從mongodb中提取數據,併在前端怎樣使用highcharts將數據呈現出來。
django的用法比較簡單,理解關鍵的文件是重點。
1> settings.py文件
顧名思義,這是django的設置文件,對於這個例子來說,位於testsite目錄所包含的testsite文件夾中。
STATIC_URL = '/static/' # 說明使用static文件夾作為靜態資源的文件夾 STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),) # 如何找到static文件夾,這個必須有,要不然Django是找不到文件夾的位置的 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 添加,如何找到templates文件夾 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 從略... }, from mongoengine import connect # 第一個參數是資料庫 connect('test', host='192.168.1.108', port=27017) # 如需驗證和指定主機名 # connect('blog', host='192.168.125.1', username='root', password='12345')
以上給出了部分代碼,註意上面藍色顯示的部分,一方面,表明瞭上面創建的static與templates文件夾是如何使用的,另一方面表明瞭連接mongodb的一種方式。
註意使用mongoengine需要先進行安裝: pip3 install mongoengine
2> urls.py
路由在這個文件中設置,文件位於testsite目錄所包含的testsite文件夾中。
from django.conf.urls import url from django.contrib import admin # 註意這兩種寫法 from testblog import views from testblog.views import house, chart urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^house/', house), url(r'^chart/', chart), ]
在上面的url中,前面一個是正則表達式,後面一個是views.py(下麵介紹)中的函數。
例如,當我們訪問 127.0.0.1:8000/chart/ 這個頁面時,django會通過views.py中設置的自定義的chart函數來處理請求。
3> views.py
這個文件用來封裝處理請求的各種函數,本項目系統會自動創建在位於testblog文件目錄下麵,testblog是上面創建的應用名稱。
from django.shortcuts import render from django.core.paginator import Paginator from testblog.models import SalesInfo # Create your views here. # 地區銷售總額 # 因為要構建highcharts需要的數據,地區要有固定的順序,需要排序 # x軸:地區 # y軸:銷售額 def area_sales(cate): pipeline = [ {'$match': {'$and': [{'category': {'$in':cate}}, {'province': {'$in': ['山東','浙江','江蘇','河北','遼寧']}}]}}, {'$group': { '_id': '$province', 'sum_sales': {'$sum': {'$multiply': ['$price', '$quantity'] }}}}, {'$sort': {'_id': 1}} ] # SalesInfo在models中設置 for i in SalesInfo._get_collection().aggregate(pipeline): print(i) data = { 'name': i['_id'], 'y': i['sum_sales'] } yield data # 對於各地區的排序,與種類無關,此處傳了參數“糧食”,使用其他種類是一樣的 c=[i['name'] for i in area_sales(['糧食'])] # 也可以使用下麵的方式獲取排序 cate = ['山東','浙江','江蘇','河北','遼寧'] b = sorted(cate) # 用於y軸的數據 sg_sales = [i for i in area_sales(['水果'])] ls_sales = [i for i in area_sales(['糧食'])] sc_sales = [i for i in area_sales(['蔬菜'])] def chart(request): context = { 'sg_sales': sg_sales, 'ls_sales': ls_sales, 'sc_sales': sc_sales, 'area': c } return render(request,'charts.html',context)
上面是關鍵部分的代碼,主要是chart函數,這個自定義的函數通過render函數將請求“request”,頁面(所謂的模板)“charts.html”,數據“context”連接起來。
毫無疑問,render函數是關鍵的一環(來源:from django.shortcuts import render)
area_sales這個生成器函數用於產生y軸需要的數據,僅是為了說明如何構造highcharts圖表所需要的數據。裡面用到的SalesInfo是在models.py文件中設置的。
4> models.py
用於設置一些ORM對象模型,位於testblog文件目錄下麵
from django.db import models from mongoengine import * # Create your models here. # 數據來源於mongodb,需要繼承自Document class SalesInfo(Document): _id = StringField() name = StringField() category = StringField() province = StringField() description = StringField() price = FloatField() quantity = IntField() unit = StringField() saledate = StringField() # 對應資料庫中的數據表 meta = {'collection':'salesnew'}
5> 模板
一系列的html頁面,統一放置在templates文件目錄下麵,頁面所需要的js、圖片、css樣式則存放到static文件夾下麵。可以將頁面中一些公用的元素拿出來作為主模板,方便重用。
A、主模板base.html
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'css/semantic.css' %} "> <script src="{% static 'js/jquery-3.1.1.js' %}"></script> <script src="{% static 'js/semantic.js' %}"></script> <!--<script src="{% static 'js/exporting.js' %}"></script>--> <script src="{% static 'js/highcharts.js' %}"></script> <script src="{% static 'js/highcharts-more.js' %}"></script> </head> <body> <div class="ui thin visible left sidebar inverted vertical menu"> <div class="header item"> <img src="../static/themes/default/assets/images/logo2.png"> </div> <div class="item"> Documents <i class="browser icon"></i> </div> <div class="item"> Charts <i class="bar chart icon"></i> </div> <div class="item"> Others <i class="idea icon"></i> </div> </div> <div class="pusher"> <div class="ui menu"> <div class="header item" id="menu"> Menu <i class="content icon"></i> </div> <div class="item">About us</div> <div class="item">Location</div> <div class="item">Others</div> </div> {% block area %}{% endblock %} </div> </div> <script> $('#menu').click(function(){ $('.ui.sidebar').sidebar('toggle'); }) </script> {% block script %}{% endblock %} </body> </html>
如上,{% load static %} 用來標識會載入static文件目錄中的內容
<link rel="stylesheet" href="{% static 'css/semantic.css' %} ">、script src="{% static 'js/highcharts.js' %}"></script> 、<script src="{% static 'js/highcharts-more.js' %}"></script> 表明瞭django中載入資源的方式 highcharts.js與highcharts-more.js是使用hightcharts圖表所需要的,可以到hightcharts官網下載。
{% block area %}{% endblock %}來標識如何使用部件,可以看作是占位符。其中area是自定義的名稱。
B、頁面 charts.html
{% extends 'base.html' %} {% block area %} <div class="ui equal width grid" style="margin:5px 0 5px 0;width:70%"> <div class="row"> <div class="column"> <div class="ui container segment"> <div class="ui container" id="chart2"></div> </div> </div> </div> </div> {% endblock %} {% block script %} <script> $(function () { // Create the chart $('#chart2').highcharts({ chart: { type: 'column' }, title: { text: '各地區銷售情況' }, subtitle: { text: 'Source: WorldSales' }, xAxis: { categories: {{area|safe}}, crosshair: true }, yAxis: { min: 0, title: { text: '金額 (元)' } }, tooltip: { headerFormat: '<span style="font-size:10px">{point.key}</span><table>', pointFormat: '<tr><td style="color:{series.color};padding:0">{series.name}: </td>' + '<td style="padding:0"><b>{point.y:.1f} 元</b></td></tr>', footerFormat: '</table>', shared: true, useHTML: true }, plotOptions: { column: { pointPadding: 0.2, borderWidth: 0 } }, series: [{ name: '水果', data: {{ sg_sales|safe }} }, { name: '糧食', data: {{ ls_sales|safe }} }, { name: '蔬菜', data: {{ sc_sales|safe }} }] }); }); </script> {% endblock %}
{% extends 'base.html' %}表明繼承自base.html
{% block area %}{% endblock %}包含了頁面的主要代碼
{% block script %}{% endblock %}包含了highcharts圖表用到的代碼,這個可以直接從highcharts官方網站複製。https://www.hcharts.cn/demo/highcharts
需要做的只是改變js中的數據源,主要的,如用於x軸的 categories: {{area|safe}},用於y軸的 data: {{ ls_sales|safe }},註意{{變數名}}是django在模板中載入變數的方式。當然,也可以換種方式,用js來填充數據,這個可以參考highcharts官網的文檔。
6> 結果
在控制臺中運行
(test_venv) C:\Projects\DjangoProjects\testsite>python manage.py runserver
會開啟開發伺服器,並得到一個網址127.0.0.1:8000,訪問 127.0.0.1:8000/chart/ 會看到下麵的結果:
當然,數據的可視化也可使用百度的echarts。參見 http://echarts.baidu.com/
總結
以上簡要的介紹了django的使用方法,包括環境的搭建,以及一個具體的例子。