Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)
閱讀目錄
- 一、MVC與MTV
- 二、多對多表的創建
- 三、ajax,前后端傳輸編碼格式contentType
- 四、批量插入數據與自定義分頁器
摘要
- MTV與MVC
- 多對多表三種創建方式
- ajax ,前后端傳輸數據編碼格式contentType
- 批量插入數據和自定義分頁器
一、MVC與MTV
-
MVC(Model View Controller 模型-視圖-控制器)
是一種Web架構的模式,所謂MVC就是把web應用分為模型(M),控制器?,視圖(V)三層;他們之間以一種插件似的,松耦合的方式連接在一起。
模型負責業務對象與數據庫的對象(ORM),視圖負責與用戶的交互(頁面),控制器?接受用戶的輸入調用模型和視圖完成用戶的請求。Model: 代表數據存取層, View 代表的是系統中選擇顯示什么和怎么顯示的部分, Controller
指的是系統中根據用戶輸入并視需要訪問模型,以決定使用哪個視圖的那部分。
-
MTV(Model Templates View 模型-模板-視圖)Django框架就是MTV模型: Models:數據存取層。
Model(模型):負責業務對象與數據庫的對象(ORM)Template(模版):負責如何把頁面展示給用戶View(視圖):負責業務邏輯,并在適當的時候調用Model和Template此外,Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Templat
該層處理與數據相關的所有事務:
如何存取、如何驗證有效,是一個抽象層,用來構建和操作你的web應用中的數據,模型是你的數據的唯一的、權威的信息源。它包含你所儲存數據的必要字段和行為。通常,每個模型對應數據庫中唯一的一張表。
模板(templates):即表現層。 該層處理與表現相關的決定:
如何在頁面或其他類型文檔中進行顯示。模板層提供了設計友好的語法來展示信息給用戶。使用模板方法可以動態地生成HTML。模板包含所需HTML
輸出的靜態部分,以及一些特殊的語法,描述如何將動態內容插入。
視圖(views):業務邏輯層,該層包含存取模型及調取恰當模板的相關邏輯。用于封裝負責處理用戶請求及返回響應的邏輯。視圖可以看作是前端與數據庫的中間人,他會將前端想要的數據從數據庫中讀出來給前端。他也會將用戶要想保存的數據寫到數據庫。
Django的MTV模式本質上與MVC模式沒有什么差別,也是各組件之間為了保持松耦合關系,只是定義上有些許不同,Django的MTV分別代表:
二、多對多表的創建
- 第①種:Django自帶的ORM自動創建的多對多表(ManyToManyField(to=’…‘))
很顯然,Django自動創建的多對多表,支持雙下劃線查詢語法。
- 第②種純手動創建多對多表:
數據庫遷移完之后我們看看創建的三張表(Navicat查看):
先創建一些數據:
提示一下:為了直接在Django頁面中運行我們的測試表查詢代碼,快速顯示結果,我們需要對Django進行配置一下:配置方法見我另一篇
下面來驗證手動創建的多對多表可否使用Django的ORM表查詢和基于雙下劃線的反向查詢:
# res1 = models.MyBook.objects.filter(pk=1).first().author.name# print(res1) # 報錯:'MyBook' object has no attribute 'author'# res2 = models.MyBook.objects.filter(pk=1).first().mybook2myauthor_set.all().info# print(res2)# res4 = models.MyBook.objects.filter(pk=1).first().author_set.all().name# print(res4) # 報錯# res5 = models.MyBook.objects.filter(pk=1).values('author__name')# print(res5) # 報錯很顯然用原來的orm方法貌似不行,同時用下劃線試了也不行很顯然,外鍵的建立位置變了,肯定這樣查不行,外鍵全部在mybook2myauthor這張表中,所以要想從一張表查到另外一張表,必須要先經過mybook2myauthor這張表。
至于如何查詢,本文不作深入探討,咱們繼續下一種方法:半自動化建立多對多表。
- 半自動創建多對多表(該方法的可拓展性高,并且符合ORM查詢規則,在項目中使用頻率也最高,需要重點掌握)
通過上面查詢結果可知這種半自動創建多對多表的方法可以使用ORM查詢方法也支持雙下劃線方法
三、ajax,前后端傳輸編碼格式contentType
- ①urlencoded (默認格式) 對應數據格式:name=jason&password=666 后端獲取方式:request.POST
django會將urlencoded編碼數據解析自動放到request.POST中 - ②formdata(form表單傳輸文件編碼格式)
注意form表單默認的傳輸編碼格式是urlencoded(enctype=“application/x-www-form-urlencoded”),如果需要傳輸文件,這里需要手動設置成formdata格式(enctype=“multipart/form-data”),
后端:通過request.POST 繼續獲取普通字符串格式數據,通過request.FILES獲取文件格式數據 - ③JSON格式(ajax支持) 什么是JSON: SON 指的是 JavaScript 對象表示法(JavaScript Object
Notation) JSON 是輕量級的文本數據交換格式 JSON 獨立于語言 * JSON 具有自我描述性,更易理解- JSON 使用 JavaScript 語法來描述數據對象,但是 JSON 仍然獨立于語言和平臺。JSON 解析器和 JSON 庫支持許多不同的編程語言。
合格的json對象(json只認雙引的字符串格式):
- JSON 使用 JavaScript 語法來描述數據對象,但是 JSON 仍然獨立于語言和平臺。JSON 解析器和 JSON 庫支持許多不同的編程語言。
不合格的json對象:
{ name: "張三", 'age': 32 } // 屬性名必須使用雙引號 [32, 64, 128, 0xFFF] // 不能使用十六進制值 { "name": "張三", "age": undefined } // 不能使用undefined { "name": "張三","birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),"getName": function() {return this.name;} // 不能使用函數和日期對象 }- 關于JSON在JavaScript中的2個方法: stringfy與parse方法
JavaScript中關于JSON對象和字符串轉換的兩個方法: JSON.parse(): 用于將一個 JSON 字符串轉換為
JavaScript 對象(json只認雙引的字符串格式)
JSON.stringify(): 用于將 JavaScript 值轉換為 JSON 字符串。
JSON.stringify({"name":"Tonny"})-
補充 JSON與XML的區別 JSON 格式于2001年由 Douglas Crockford 提出,目的就是取代繁瑣笨重的 XML
格式。JSON 格式有兩個顯著的優點:書寫簡單,一目了然;符合 JavaScript
原生語法,可以由解釋引擎直接處理,不用另外添加解析代碼。所以,JSON迅速被接受,已經成為各大網站交換數據的標準格式,并被寫入ECMAScript
5,成為標準的一部分。XML和JSON都使用結構化方法來標記數據,下面來做一個簡單的比較。
用XML表示中國部分省市數據如下:
由上面的兩端代碼可以看出,JSON 簡單的語法格式和清晰的層次結構明顯要比 XML 容易閱讀,并且在數據交換方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得節約傳輸數據所占用得帶寬。 -
ajax簡介: AJAX(Asynchronous Javascript And
XML)翻譯成中文就是“異步的Javascript和XML”。即使用Javascript語言與服務器進行異步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML)。AJAX 不是新的編程語言,而是一種使用現有標準的新方法。
AJAX
最大的優點是在不重新加載整個頁面的情況下,可以與服務器交換數據并更新部分網頁內容。(這一特點給用戶的感受是在不知不覺中完成請求和響應過程)AJAX 不需要任何瀏覽器插件,但需要用戶允許JavaScript在瀏覽器上執行。
同步交互:客戶端發出一個請求后,需要等待服務器響應結束后,才能發出第二個請求;
異步交互:客戶端發出一個請求后,無需等待服務器響應結束,就可以發出第二個請求。 -
ajax的基本使用方法:
#前端向后端請求方式:1 瀏覽器手動輸入網址(get請求),2 a標簽的href屬性(get請求),form表單(get/post請求,默認為get)
#ajax特點:異步提交、局部刷新
#基本使用語法: 提交url (url:’…‘) 提交方式 (type: ‘post’) 提交數據 (data:{’’’}) 提交后通過回調函數得到的返回結果 (sucess:function(data){…})
#基本使用示例:(ajax的默認傳輸數據的格式是urlencoded)
我們知道ajax默認的傳輸數據格式是urlencoded,前面我們說過,ajax可以用json作為數據格式傳輸
現在強調一點:前后端傳輸數據必須要求數據是什么格式就應該用對應的傳輸格式,一一對應去傳輸,否則Django解析數據出問題,以至于我們在前后端拿不到想要的數據。
所以:
第一:我們需要在ajax發送請求代碼中指定發送數據格式:
contentType: ‘application/json’,
第二:后端獲取json格式數據不再是request.POST,而是通過request.body(得到的是一個bytes類型的json格式數據),所以再處理一下:
res = json.loads(request.body.decode(‘utf-8’)),這就得到前端ajax發送過來的json格式數據
- ajax傳文件 前端:
后端
def ttt(request):if request.method == 'POST':print(request.POST) # 拿到ajax傳來的formdata普通鍵值數據print(request.FILES) # 拿到ajax傳來的formdata文件return HttpResponse('我從后端來,文件[%s]已收到' % request.FILES.get('myfile'))return render(request, 'ttt.html')
通過ajax監控input框,發送數據到后端判斷輸入用戶名是否存在與數據庫user表中
前端:
后端:
def ttt(request):if request.method == 'POST':res = {'flag': False}# 獲取到ajax發送過來的usernameusername = request.POST.get('username')# 通過username進行數據庫查詢user_obj = models.User.objects.filter(name=username).first()# 判斷用戶名是否存在與數據庫中if user_obj:res['flag'] = Truereturn JsonResponse(res)return render(request, 'ttt.html')結果演示:
總結一下:
form表單與ajax的異同點:
1、form表單不支持異步提交,局部刷新
2、form表單不支持傳輸json格式數據
3、form表單與ajax默認傳輸數據編碼格式都是urlencoded
四、批量插入數據與自定義分頁器
- bulk_create批量插入數據
當我們使用orm來一次性新增很多表記錄的時候,等待結果的時間會非常的慢,如果一次性需要批量插入很多數據的時候就需要使用bulk_create來批量插入數據
- 自定義分頁器 自定義分頁器的實現過程: 每一頁顯示多少條數據
第n頁顯示的數據在全部條數據中的開始和結尾索引位置,然后通過這個索引位置進行切片處理,取出這一頁的所有數據的對象列表,在后端進行for循環渲染成html代碼后通過模板語法發送到前端,通過safe方法實現前端的動態渲染,達到點擊對應頁數標簽進行頁面切換的效果顯示
tip:需要用到的相關知識與方法:列表的切片[0:10],a標簽的href="?page=6"(路徑前加上一個?,表示當前路徑自動補全),divmod()方法(div(100,9)>>(11,1)
除取余),models.User.objects.all().count()計算記錄總條數
分頁器的實現如果自己寫下來還是比較麻煩的,所以我們直接使用已經封裝好的分頁器就行了,下面介紹一個分頁器模板,只需幾步操作就
下面通過上面的批量插入數據和分頁器模板來實現分頁效果:
先批量插入數據:
然后操作分頁器的實現:
①:app01程序文件夾下面新建文件夾utils>>>>>>在utils下面新建.my_page.py文件,名字隨便取
②:my_page.py文件內:將剛才的模板代碼粘貼進去
③:視圖文件views.py中:
④:html文件中:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>圖書管理系統</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"><script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script><link rel="stylesheet" href="/static/layui/css/layui.css"><script src="/static/layui/layui.js"></script><script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script> </head> <body> <div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><table class="text-center table-bordered table table-hover table-striped"><thead><tr><th>ID</th><th>name</th><th>password</th></tr></thead><tbody>{% for user in page_queryset %}<tr><th>{{ user.pk }}</th><th>{{ user.name }}</th><th>{{ user.password }}</th></tr>{% endfor %}</tbody></table>{{ page_obj.page_html|safe }}</div></div> </div></body> </html>
演示結果:
總結
以上是生活随笔為你收集整理的Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web框架之Django_06 模型层了
- 下一篇: c++ string 长度限制_Stri