MTV和MVC的思想是同樣的的,只是思想的體現有所不一樣。javascript
MVC:M管理應用程序的狀態,並約束改變狀態的行爲,通常叫作業務規則;V負責把數據格式化後呈現給用戶查看;C接收用戶操做,根據訪問模型獲取數據,並調用視圖顯示這些數據,控制器(處理器)用於將模型與視圖隔離併成爲兩者之間的聯繫紐帶。html
MTV:M表明數據存取層,也就是Model,改爲處理與數據相關的全部事務如何存取,如何驗證數據的有效性,包含哪些行爲與數據相關;T指的是表現層,該層處理與現實相關的行爲,如何在頁面文檔中顯示數據,展示內容,也就是Template;V表明業務邏輯層,該層包含存取模型及調取恰當模板的相關邏輯。java
Django也是一個MVC框架。可是在Django中,控制器接受用戶輸入的部分由框架自行處理,因此 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),稱爲 MTV模式。node
1.對象關係映射 (ORM,object-relational mapping):python
2.URL 分派:mysql
3.模版系統:jquery
4.表單處理:git
5.Cache系統:web
6.會話(session):ajax
7.國際化:
8.自動化的管理界面(Model):
建立程序
啓動服務器
建立APP
同步數據庫
建立數據配置文件
建立表結構
建立超級管理員
啓動命令行模式
查看命令列表
導入 PyMySQL模塊
因爲Python開發經常使用Python3.x,Django鏈接數據庫的時候使用的是MySQL的MySQLdb模塊,然而在Python3中尚未此模塊,所以須要使用pymysql進行代替,下面的配置代碼寫入到項目目錄的init.py中便可:
Django框架對於開發者而言高度透明化,對於不一樣數據庫的具體使用方法是一致的,改變數據庫類型只須要變更上述配置便可。
Django提供了一個抽象層(「Model」)來構建和管理Web應用程序的數據。Django中遵循 Code Frist 的原則,即:根據代碼中定義的類來自動生成數據庫表。關係對象映射(Object Relational Mapping,簡稱ORM)。
建立Django項目後的目錄結構:
# file:models.py
執行命令: python manage.py makemigrations
執行命令:python manage.py migrate
可視化以下:
16.help_text # 在Admin中提示幫助信息
1. models.AutoField
2. models.CharField
3. models.BooleanField
4. models.ComaSeparatedIntegerField
5. models.DateField
6. models.DateTimeField
7. models.Decimal
8. models.EmailField
9. models.FloatField
10. models.IntegerField
11. models.BigIntegerField
24.models.ImageField
更改Admin中的錯誤提示:
一對多:models.ForeignKey(其餘表)
多對多:models.ManyToManyField(其餘表)
一對一:models.OneToOneField(其餘表)
1. 一對多:
2. 一對一:
3. 多對多:
1.對數據進行增長數據:
1.1也能夠直接傳入字典建立:
2. 刪除數據:
3.修改數據:
4.查詢數據:
1.獲取個數:
2.比較大小:
3.是否包含:
4.是否爲空:
5.contains:
6. range範圍:
7.其餘的操做:
8. order by:
9. group by:
10. limit 、offset:
11. regex正則匹配,iregex 不區分大小寫:
12.日期:
13.年月日周時分秒:
14.extra:
extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None),有些狀況下,Django的查詢語法難以簡單的表達複雜的 WHERE 子句,對於這種狀況, Django 提供了 extra() QuerySet 修改機制,它能在 QuerySet生成的SQL從句中注入新子句。不管什麼時候你都須要很是當心的使用extra(). 每次使用它時,您都應該轉義用戶可使用params控制的任何參數,以防止SQL注入攻擊。因爲產品差別的緣由,這些自定義的查詢難以保障在不一樣的數據庫之間兼容(由於你手寫 SQL 代碼的緣由),並且違背了 DRY 原則,因此如非必要,仍是儘可能避免寫 extra。
from django.db.models import F
models.Tb1.objects.update(num=F('num')+1) #F用於拿到原始數據
# ##方式一:
# ##方式二:
2.一對一操做:
3.一對多操做:
# 正向查找一對多
# 反向查找一對多
4.多對多操做:
# 添加數據
#group_obj.user_info.add(user_info_obj) \#group_obj.user_info.add(*user_info_objs)
# 刪除數據
# 添加數據
# 刪除數據
# 獲取數據
# 獲取數據
# 添加多對多
Django的路由系統本質就是URL正則與調用的視圖函數之間的映射表,URL的加載是從配置中開始的。
這樣Django也就很好的支持了靜態路由,基於正則的動態路由,以及二級路由,一樣開發人員也能夠自行使用基於請求方法的路由。
參數是可選的要傳遞給視圖函數的默認參數(字典形式)
別名也是可選的
例如:
其餘使用正則的例子:
說明:
使用正則分組:
Django的二級路由示例:
須要注意的是,當你加上參數時,對應函數views.year_archive必須加上一個參數,參數名也必須命名爲 foo,這樣就實現了參數名的靜態綁定,放置參數順序出錯。
HTTP中產生的兩大對象:
當請求一個HTML頁面的時候,Django將會建立一個HttpRequest對象包含原數據的請求,而後Django加載適合的視圖,經過HTTPRequest做爲視圖函數的一地個參數。每一個視圖負責返回一個HttpResponse響應。
HttpRequest對象的屬性:
GET: 包含全部HTTP GET參數的類字典對象
POST:包含全部HTTP POST參數的類字典對象
服務器收到空的POST請求的狀況也是可能發生的,也就是說,表單form經過HTTP POST方法提交請求,可是表單中可能沒有數據,所以不能使用if req.POST來判斷是否使用了HTTP POST 方法;應該使用if req.method=="POST"。
COOKIES:
FILES:
5. user:
是一個django.contrib.auth.models.User對象,表明當前登錄的用戶。若是訪問用戶當前沒有登錄,user將被初始化爲django.contrib.auth.models.AnonymousUser的實例。能夠經過user的is_authenticated()方法來辨別用戶是否登錄:
6. session:
7. META:
一個標準的Python字典包含全部可用的HTTP頭。可用標題取決於客戶端和服務器,一些例子:
對於HtppResponse對象來講,是由Django自動建立的牡丹石HTTPResponse對象必須開發人員手動建立,每一個View請求處理方法必須返回一個HTTPResponse對象。
HTTPResponse對象經常使用的方法:
對於render的:
結合給定的模板與一個給定的上下文,返回一個字典HttpResponse在渲染文本對象。
要使用模板,必然會牽扯到靜態文件的配置,好比CSS,Js等,在Django的項目目錄中的settings.py中追加:
其中static是存放靜態文件的目錄,這樣就能在HTML頁面中引用特效或者圖片了。對於模板,其實就是讀取模板,模板中嵌套着標籤,而後渲染數據的時候,從Model中取出數據插入到模板中,最後用戶接收到請求的響應。
模板語言:
繼承:
其餘經常使用方法:
在字典中取出數據使用dict.some的形式
自定義標籤:
由於在模板語言中不能進行邏輯運算,因此在Django中提供兩種自定義的標籤,
simple_tag能夠傳遞任意參數,可是不能用做布爾判斷,filter最多隻能傳遞2個參數,能夠用作布爾判斷,一樣的,simple_tag和filter的實現是相似的。
示例代碼:
在HTML文件中導入以前建立的Python文件,使用load命令:
使用simple_tag:
須要在項目目錄中的settings.py中配置當前的APP:
(8)Django的中間件:
中間件示意圖:
每一次用戶的請求都會一層一層穿過中間件,當不符合中間件的業務邏輯的時候就會直接返回,用戶請求到達不了最裏層的業務邏輯處理函數,這樣能夠自定義中間件,在不使用Nginx等第三方工具的時候統計每次用戶的訪問次數。
中間件其實就是一個Python文件,可是其中的類須要繼承自
from django.utils.deprecation import MiddlewareMixin
,
在這個文件中能夠建立以下5中函數:
# 請求到來以前執行
# 數據返回以前執行
# 執行view中的方法以前執行
# 程序出錯時執行
# 渲染模板數據時執行
須要在項目目錄中的settings.py文件中設置: