1 # 先講數據庫中的數據所有展現到前端 而後給每個數據兩個按鈕 一個編輯一個刪除 2 3 # 查看 4 def userlist(request): 5 # 查詢出用戶表裏面全部的數據 6 # 方式1 7 # data = models.User.objects.filter() 8 # print(data) 9 # 方式2 10 user_queryset = models.User.objects.all() 11 # return render(request,'userlist.html',{'user_queryset':user_queryset}) 12 return render(request,'userlist.html',locals()) 13 14 # 編輯功能 15 # 點擊編輯按鈕朝後端發送編輯數據的請求 16 """ 17 如何告訴後端用戶想要編輯哪條數據? 18 將編輯按鈕所在的那一行數據的主鍵值發送給後端 19 利用url問號後面攜帶參數的方式 20 21 {% for user_obj in user_queryset %} 22 <tr> 23 <td>{{ user_obj.id }}</td> 24 <td>{{ user_obj.username }}</td> 25 <td>{{ user_obj.password }}</td> 26 <td> 27 <a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">編輯</a> 28 <a href="" class="btn btn-danger btn-xs">刪除</a> 29 </td> 30 </tr> 31 {% endfor %} 32 """ 33 # 後端查詢出用戶想要編輯的數據對象 展現到前端頁面供用戶查看和編輯 34 def edit_user(request): 35 # 獲取url問號後面的參數 36 edit_id = request.GET.get('user_id') 37 # 查詢當前用戶想要編輯的數據對象 38 edit_obj = models.User.objects.filter(id=edit_id).first() 39 40 if request.method == "POST": 41 username = request.POST.get('username') 42 password = request.POST.get('password') 43 # 去數據庫中修改對應的數據內容 44 # 修改數據方式1 45 # models.User.objects.filter(id=edit_id).update(username=username,password=password) 46 """ 47 將filter查詢出來的列表中全部的對象所有更新 批量更新操做 48 只修改被修改的字段 49 """ 50 51 # 修改數據方式2 52 edit_obj.username = username 53 edit_obj.password= password 54 edit_obj.save() 55 """ 56 上述方法當字段特別多的時候效率會很是的低 57 從頭至尾將數據的全部字段所有更新一邊 不管該字段是否被修改 58 """ 59 60 # 跳轉到數據的展現頁面 61 return redirect('/userlist/') 62 63 64 65 # 將數據對象展現到頁面上 66 return render(request,'edit_user.html',locals()) 67 68 # 刪除功能 69 """ 70 跟編輯功能邏輯相似 71 def delete_user(request): 72 # 獲取用戶想要刪除的數據id值 73 delete_id = request.GET.get('user_id') 74 # 直接去數據庫中找到對應的數據刪除便可 75 models.User.objects.filter(id=delete_id).delete() 76 """ 77 批量刪除 78 """ 79 # 跳轉到展現頁面 80 81 return redirect('/userlist/') 82 83 """ 84 # 真正的刪除功能應該須要二次確認 咱們這裏先不作後面會講 85 # 刪除數據內部其實並非真正的刪除 咱們會給數據添加一個標識字段用來表示當前數據是否被刪除了,若是數據被刪了僅僅只是講字段修改一個狀態 86 username password is_delete 87 jason 123 0 88 egon 123 1
1 """ 2 表與表之間的關係 3 一對多 4 5 多對多 6 7 一對一 8 9 沒有關係 10 11 判斷表關係的方法:換位思考 12 """ 13 圖書表 14 15 出版社表 16 17 做者表 18 19 做者詳情表 20 21 22 """ 23 圖書和出版社是一對多的關係 外鍵字段建在多的那一方 book 24 25 圖書和做者是多對多的關係 須要建立第三張表來專門存儲 26 27 做者與做者詳情表是一對一 28 """ 29 from django.db import models 30 31 # Create your models here. 32 33 34 # 建立表關係 先將基表建立出來 而後再添加外鍵字段 35 class Book(models.Model): 36 title = models.CharField(max_length=32) 37 price = models.DecimalField(max_digits=8,decimal_places=2) 38 # 總共八位 小數點後面佔兩位 39 """ 40 圖書和出版社是一對多 而且書是多的一方 因此外鍵字段放在書表裏面 41 """ 42 publish = models.ForeignKey(to='Publish') # 默認就是與出版社表的主鍵字段作外鍵關聯 43 """ 44 若是字段對應的是ForeignKey 那麼會orm會自動在字段的後面加_id 45 若是你自做聰明的加了_id那麼orm仍是會在後面繼續加_id 46 47 後面在定義ForeignKey的時候就不要本身加_id 48 """ 49 50 51 """ 52 圖書和做者是多對多的關係 外鍵字段建在任意一方都可 可是推薦你建在查詢頻率較高的一方 53 """ 54 authors = models.ManyToManyField(to='Author') 55 """ 56 authors是一個虛擬字段 主要是用來告訴orm 書籍表和做者表是多對多關係 57 讓orm自動幫你建立第三張關係表 58 """ 59 60 61 class Publish(models.Model): 62 name = models.CharField(max_length=32) 63 addr = models.CharField(max_length=32) 64 65 66 class Author(models.Model): 67 name = models.CharField(max_length=32) 68 age = models.IntegerField() 69 """ 70 做者與做者詳情是一對一的關係 外鍵字段建在任意一方均可以 可是推薦你建在查詢頻率較高的表中 71 """ 72 author_detail = models.OneToOneField(to='AuthorDetail') 73 """ 74 OneToOneField也會自動給字段加_id後綴 75 因此你也不要自做聰明的本身加_id 76 """ 77 78 class AuthorDetail(models.Model): 79 phone = models.BigIntegerField() # 或者直接字符類型 80 addr = models.CharField(max_length=32) 81 82 83 """ 84 orm中如何定義三種關係 85 publish = models.ForeignKey(to='Publish') # 默認就是與出版社表的主鍵字段作外鍵關聯 86 87 authors = models.ManyToManyField(to='Author') 88 89 author_detail = models.OneToOneField(to='AuthorDetail') 90 91 92 ForeignKey 93 OneToOneField 94 會自動在字段後面加_id後綴 95 """ 96 97 # 在django1.X版本中外鍵默認都是級聯更新刪除的 98 # 多對多的表關係能夠有好幾種建立方式 這裏暫且先介紹一種 99 # 針對外鍵字段裏面的其餘參數 暫時不要考慮 若是感興趣本身能夠百度試試看
1 # 每一個人都要會畫 這個圖是大家後期複習django最好的一個梳理方式 2 3 4 # 擴展知識點 5 6 """ 7 緩存數據庫 8 提早已經將你想要的數據準備好了 你來直接拿就能夠 9 提升效率和響應時間 10 11 當你在修改你的數據的時候 你會發現數據並非馬上修改完成的 12 而是須要通過一段時間纔會修改 13 博客園 14 15 瞭解便可 16 """
1 # 路由匹配 2 url(r'test',views.test), 3 url(r'testadd',views.testadd) 4 """ 5 url方法第一個參數是正則表達式 6 只要第一個參數正則表達式可以匹配到內容 那麼就會馬上中止往下匹配 7 直接執行對應的視圖函數 8 9 你在輸入url的時候會默認加斜槓 10 django內部幫你作到重定向 11 一次匹配不行 12 url後面加斜槓再來一次 13 """ 14 # 取消自動加斜槓 15 APPEND_SLASH = False/True # 默認是自動加斜槓的 16 17 18 urlpatterns = [ 19 url(r'^admin/', admin.site.urls), 20 # 首頁 21 url(r'^$',views.home), 22 # 路由匹配 23 url(r'^test/$',views.test), 24 url(r'^testadd/$',views.testadd), 25 # 尾頁(瞭解) 26 url(r'',views.error), 27 ]
1 """ 2 分組:就是給某一段正則表達式用小括號擴起來 3 """ 4 url(r'^test/(\d+)/',views.test) 5 6 def test(request,xx): 7 print(xx) 8 return HttpResponse('test') 9 10 # 無名分組就是將括號內正則表達式匹配到的內容看成位置參數傳遞給後面的視圖函數
1 """ 2 能夠給正則表達式起一個別名 3 """ 4 url(r'^testadd/(?P<year>\d+)',views.testadd) 5 6 def testadd(request,year): 7 print(year) 8 return HttpResponse('testadd') 9 10 # 有名分組就是將括號內正則表達式匹配到的內容看成關鍵字參數傳遞給後面的視圖函數
1 """ 2 嘻嘻 不能混用 3 可是同一個分組可使用N屢次 4 """ 5 6 # 單個的分組可使用屢次 7 url(r'^index/(\d+)/(\d+)/(\d+)/',views.index), 8 url(r'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),
1 # 經過一些方法獲得一個結果 該結果能夠直接訪問對應的url觸發視圖函數 2 3 # 先給路由與視圖函數起一個別名 4 url(r'^func_kkk/',views.func,name='ooo') 5 # 反向解析 6 # 後端反向解析 7 from django.shortcuts import render,HttpResponse,redirect,reverse 8 reverse('ooo') 9 # 前端反向解析 10 <a href="{% url 'ooo' %}">111</a>
1 """ 2 今日考題 3 1.列舉你知道的orm數據的增刪改查方法 4 2.表關係如何斷定,django orm中如何創建表關係,有什麼特色和注意事項 5 3.請畫出完整的django請求生命週期流程圖 6 4.無名、有名分組各是什麼意思 7 5.反向解析是什麼,如何使用, 8 """
1 # 查詢全部數據 2 res = models.User.objects.filter() 3 res = models.User.objects.all() 4 # 編輯數據 5 """ 6 1.首先得獲取用戶想要編輯的數據主鍵值 7 url?edit_id=1 8 url/1/ 9 2.後端查詢出對應的數據對象展現到前端 10 利用input標籤的value屬性 11 3.提交post請求修改數據 12 前期提交post請求必定要先去配置文件中註釋點一行(csrf...) 13 若是不註釋會報403錯誤 14 """ 15 # 批量更新 16 models.User.objects.filter(id=edit_id).update(**kwargs) 17 # 單個更新 18 user_obj = models.User.objects.filter(id=edit_id).first() 19 user_obj.username = 'jason' 20 user_obj.passsword = '666' 21 user_obj.save() 22 """ 23 該方法當字段比較多的時候效率很下降不少 24 由於它是從頭至尾講數據全部的字段從新寫一遍 25 """ 26 # 刪除數據 27 """ 28 1.數據並不會真正意義上的刪除,咱們在建立表的時候會加一個用來標示是否被刪除的字段 29 is_delete 30 is_alive 31 is_status 32 ... 33 刪數據其實就是修改字段的狀態 以後經過代碼篩選出沒有刪除的狀態數據便可 34 35 2.刪除數據的時候應該有一個二次確認的過程而不該該直接刪除 36 ajax講完以後加二次確認結合sweetalaert 37 """
1 class User: 2 models.ForeignKey(to='Publish') 3 models.ForeignKey(to=Publish) # 報錯 4 5 class Publish: 6 pass 7 8 """ 9 一對多 10 models.ForeignKey(to='關聯表名') 經常使用 11 models.ForeignKey(to=關聯表名) 關聯表名必須出如今上方(瞭解便可) 12 1.在django1.X版本中外鍵默認就是級聯更新刪除的 13 2.會自動給字段加_id後綴 不管你有沒有加(本身不要自做聰明的加上) 14 3.一對多 外鍵字段建在多的一方 15 16 一對一 17 models.OneToOneField(to='關聯表名') 18 1.在django1.X版本中外鍵默認就是級聯更新刪除的 19 2.會自動給字段加_id後綴 不管你有沒有加(本身不要自做聰明的加上) 20 3.外鍵建在任意一方都可 可是推薦你建在查詢頻率較高的表中(orm查詢方便) 21 22 多對多 23 models.ManyToManyField(to='關聯表名') 24 1.在django1.X版本中外鍵默認就是級聯更新刪除的 25 2.該字段是一個虛擬字段不會真正的在表中展現出來 而是用來告訴Django orm當前表和關聯表是多對多的外鍵關係 須要自動建立第三張關係表 26 3.在Django orm中多對多的表關係有好幾種(三種)建立方式 27 4.外鍵建在任意一方都可 可是推薦你建在查詢頻率較高的表中(orm查詢方便) 28 29 判斷表關係的方式:換位思考 30 """
1 """ 2 瀏覽器 3 發送請求(HTTP協議) 4 5 web服務網關接口 6 1.請求來的時候解析封裝 7 響應走的時候打包處理 8 9 2.django默認的wsgiref模塊不能承受高併發 最大隻有1000左右 10 上線以後會替換成uwsgi來增長併發量 11 12 3.WSGI跟wsgiref和uwsgi是什麼關係 13 WSGI是協議 14 wsgiref和uwsgi是實現該協議的功能模塊 15 16 django後端 17 1.django中間件(暫時不考慮 後面講) 18 相似於django的保安 門戶 19 20 2.urls.py 路由層 21 識別路由匹配對應的視圖函數 22 23 3.views.py 視圖層 24 網站總體的業務邏輯 25 26 4.templates文件夾 模版層 27 網站全部的html文件 28 29 5.models.py 模型層 30 ORM 31 額外擴展:緩存數據庫的做用 32 """
1 """ 2 url()方法第一個參數是正則表達式 3 一旦匹配成功了 就不會往下走了 而是直接觸發正則後面的視圖函數的運行 4 5 url(r'^admin/',...) 6 7 # 首頁 8 url(r'^$',...) 9 # 尾頁 10 url(r'',...) 11 """ 12 13 # django路由匹配的時候其實能夠匹配兩次 第一次若是url後面沒有加斜槓 django會讓瀏覽器加斜槓再發送一次請求 14 配置文件 15 APPEND_SLASH = True/False
1 # 無名分組 2 url(r'^index/(\d+)/',view.index) 3 """ 4 將括號內正則表達式匹配的內容看成位置參數傳遞給後面的視圖函數 5 index(request,111) 6 """ 7 8 # 有名分組 9 url(r'^index/(?P<year>\d+)/',view.index) 10 """ 11 將括號內正則表達式匹配的內容看成關鍵字參數傳遞給後面的視圖函數 12 index(request,year=111) 13 """ 14 15 # 無名和有名不能混合使用 16 17 # 單個分組均可以重複使用 18 url(r'^index/(\d+)/(\d+)/(\d+)/',view.index) 19 url(r'^index/(?P<year>\d+)/(?P<xxx>\d+)/(?P<ooo>\d+)/',view.index)
1 """ 2 本質:經過一些方法獲得一個結果 該結果能夠訪問到對應的url從而觸發視圖函數的運行 3 """ 4 # 最簡單的狀況 url第一個參數裏面沒有正則符號 5 url(r'^index/',view.index,name='xxx') 6 # 前端 7 {% url 'xxx' %} 8 # 後端 9 from django.shortcuts import reverse 10 reverse('xxx') 11 """ 12 別名不能出現衝突!!! 13 """
1 """ 2 必作題: 3 1.整理今日內容到博客 4 2.本身完成單表的增刪改查功能(結合前端鼠標點點操做) 5 3.本身找幾張表練習如何建立表與表之間的關係 6 選作題: 7 1.嘗試着利用路由匹配和反向解析完成數據的編輯和刪除功能 8 2.構思圖書管理系統(後面會講,本身先嚐試着看看) 9 """