在上一篇:Django之--通過MVC架構的html模板展示Hello World! 講述了基本的MVC模型,但是卻並沒有測試Model的作用,本文通過mysql數據庫來測試。
Django自帶的model支持多數主流數據庫,如MySQL、Oracle、PostgreSQL、SQLLite等,對MSSQL的支持可能不是很好,如果你自己寫Model那就無所謂了。
如果你要使用Django自帶的數據庫Model,那么參照如下網址的步驟一步步做就可以了,本文為深入了解Model的功能以及其與view的聯動(閑的蛋疼)自己寫個簡易的Model。(生產推薦用自帶的model,BUG少兼容性好)
http://www.runoob.com/django/django-model.html
1.首先我們在數據庫中插入一些數據,如下所示:
create table product(
id int auto_increment primary key,
name varchar(100) comment "商品名稱",
price decimal(10,2) comment "商品價格",
quantity int comment "商品當前保有量"
);
insert into product(name,price,quantity) values('鉛筆',1.00,100),('橡皮',0.5,200),('鋼筆',5.00,50),
('復讀機',200,10),('手機',2399,20);
我們的預期目標是在頁面展示我們的商品種類,然后向用戶提供一個搜索框,輸入產品名然后返回如下商品信息:
“XXX的價格是:XXX,當前余量為:XXX。”
2.這次Model我們不用Django自帶的,自己編輯/root/Django/mysite/mysite/mysql.py文件:
# -*- coding: utf-8 -*-
from MySQLdb import *
config = {'host':'192.168.1.193','port':3306,'user':'leo','password':'mysql','db':'test','charset':'utf8'}
def db_modify(sql):
try:
conn = Connect(**config)
cur = conn.cursor()
cur.execute(sql)
conn.commit()
except:
conn.rollback()
print ('SQL is not executed properly...')
finally:
conn.close()
def db_query(query_sql):
try:
conn=Connect(**config)
cur=conn.cursor()
cur.execute(query_sql)
result=cur.fetchall()
return result
except:
print ('SQL is not executed properly...')
finally:
conn.close()
3.接下來修改urls.py(MVC之Controller)
from django.conf.urls import url
from . import view,product --import product,product.py會在下一步定義,就是MVC中的View,相當於上一篇中的view.py
urlpatterns = [
url(r'^hello$', view.hello),
url(r'^product-page$', product.page), #新加項
url(r'^product-result$', product.result), #新加項
]
我們在訪問http://192.168.1.193:8000/product-page時會執行product.page函數進行商品展示,搜索時跳轉至http://192.168.1.193:8000/product-result頁面。
4.創建/root/Django/mysite/mysite/product.py文件(MVC之View)
Ps:建議使用pycharm這種編輯器寫Python,因為編輯器會把tab轉成空格,而tab的存在很可能造成inconsistent use of tabs and spaces的錯誤。
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render
from . import mysql
# 表單
def page(request):
context={}
context['標題'] ='商品種類:'
pro_list=mysql.db_query("select distinct name from product")
context['商品列表']=[]
for i in range(0,len(pro_list)):
context['商品列表'].append(pro_list[i][0])
return render(request,'page.html',context)
# 接收請求數據
def result(request):
request.encoding='utf-8'
pro=request.GET['q']
if not pro.strip():
message = '搜索項不能為空'
else:
price_quan=mysql.db_query("select price,quantity from product where name='%s'"%(pro))
price=str(price_quan[0][0])
quantity=str(price_quan[0][1])
message = '你搜索的商品為: ' + pro + '商品價格為:' + price + '商品余量為:' + quantity
return HttpResponse(message)
模板的位置是在/root/Django/mysite/templates下,這里添加page.html如下:
<!DOCTYPE html>
<html>
<h3>{{ 標題 }}</h3>
<body>
<p>
{% for 商品 in 商品列表 %}
<li><font face="verdana" color="blue" size=4>{{ 商品 }}</font></li>
{% endfor %}
</p>
<br>
<form action="/product-result" method="get">
<input type="text" name="q">
<input type="submit" value="查看商品信息">
</form>
</body>
</html>
開啟Django Server:python3 manage.py runserver 0.0.0.0:8000
最終的展示效果如下:


總結:
細想一下似乎也沒做多少工作,關於HTTP的底層交互Django都幫你做了,你需要做的就是寫個數據庫查詢模塊,HTML的展示頁面,最后向urls.py里加入你想設置的URL就完事了。
然后再根據MVC架構來捋一下本次實驗中的對應代碼:
urls.py:一直都是control層,通過調用product來實現頁面展示
product.py:這個文件的作用很明顯,就是通過mysql.py從數據庫取數據,然后將數據整合到模板中,因此是view層
mysql.py:Model層,直接與數據庫交互
page.html:本次的template模板,用於生成html頁面
最后,本文使用的是http的get方法獲取進行請求,結果頁面需要跳轉,下一篇描述如何使用POST方法直接在當前搜索頁面顯示結果。
