Django之--MVC的Model


在上一篇: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方法直接在當前搜索頁面顯示結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM