1 昨日內容回顧: 2 1.choices字段 3 只要是可以羅列出來的有限個選項均可以使用choices字段來作參數 4 1.學歷,工做經歷,性別,工做狀態,客戶來源,婚嫁 5 gender_choices = ((1,'male'),(2,'female'),(3,'others')) 6 gender = models.IntegerField(choices=gender_choices) 7 # 當gender存的是gender_choices中羅列的數字 那麼就會有對應關係 8 # 可是若是存的數字不存在,那麼也不會報錯 正常存儲 只不過沒了對應關係而已 9 10 2.user_obj.gender # 結果是數字 11 user_obj.get_gender_display() 拿到數字所對應的註釋 12 13 2.django的MTV與MVC模型 14 M:models 15 T:templates 16 V:views 17 MVC 18 M:models 19 V:views 20 C:controller 控制器(urls) 21 django自稱是MTV可是MTV本質也是MVC 22 23 3.Ajax 24 異步提交 局部刷新 25 26 基本語法結構: 27 $.ajax({ 28 url:'', # 默認不寫就是當前路徑(不寫,後綴,全稱) 29 type:'post', # 請求方式 30 data:{'name':'jason} # 數據默認格式是urlencoded(name=jason&pwd=123) 31 success:function(data){ 32 # data 就是後返回的異步提交的結果 一般都是一個字典 33 if (data.code == 1000){ 34 # 狀態碼是1000的狀況下 須要走的邏輯 35 }elif(data.code == 2000){ 36 # 狀態碼是2000的狀況下 須要走的邏輯 37 }else{ 38 # 其餘狀況 須要的操做 39 } 40 } 41 }) 42 一般狀況下 後端針對ajax交互 都是採起字典的形式 43 44 4.contentType先後端傳輸數據的編碼方式 45 1.urlencoded >>> name=jason&pwd=123&hobby=read 46 2.formdata >>> 傳文件/也支持傳普通鍵值(name=jason&pwd=123&hobby=read) 47 3.application/json >>> json格式數據 (form表單是沒法發送json格式數據的) 48 49 詳解: 50 1.form,ajax表單默認的是urlencoded 51 django 後端針對不一樣的編碼格式是如何處理的> 52 只要是符合urlencoded編碼格式 都會被後端自動獲取並解析放到request.POST中 53 若是是符合formdata那麼文件會被自動解析放到request.FILES中 54 若是是json格式,後端默認不解析 ,以二進制形式放在request.body 你能夠本身手動處理便可 55 56 2.ajax發送json格式數據 57 """先後端傳輸數據 必定要確保數據與編碼方式的一致性""" 58 $.ajax({ 59 url:'', # 默認不寫就是當前路徑 (不寫,後綴,全稱) 60 type:'post', # 請求方式 61 data:JSON.stringify({'name':'jason'}), 62 # 數據 數據默認的格式是urlencoded(name=jason$pwd=123) 63 contentType:'application/json', 64 success:function(data){ 65 # data就是後返回的異步提交的結果 一般是一個字典 66 if (data.code == 1000){ 67 # 狀態碼是1000的狀況須要走的邏輯 68 }elif(data.code == 2000){ 69 # 狀態碼是2000的狀況須要走的邏輯 70 }else{ 71 # 其餘狀況 須要的操做 72 } 73 } 74 }) 75 3.ajax 發送文件 76 1.利用內置對象FormData 77 既能夠 傳文件 也能夠是 普通的鍵值對 78 2.獲取input 標籤存儲的文件對象 79 先用jQuery找到該input 標籤,而後轉成原生的js對象 80 而後固定語法 .files[0] 81 $('input')[0].files[0] 82 3.發送ajax請求 83 有兩個關鍵性參數須要你指定 84 processData:false # //告訴前端不要處理數據 85 contentType:false # 不適合任何編碼 86 django後端 就會普通的鍵值解析到request.POST中文件解析到request.FILES 87 88 89 補充: 90 1.sweetalert 91 注意推導思路 92 刪除彈框 93 做業:圖書管理的系統的刪除書籍功能 94 2.序列化組件 95 from django.core import serializers 96 3.自定義分頁器 97 1.quertset支持切片取值 98 須要你掌握的就是推導思路 99 後端 100 book_list = models.Book.objects.all() 101 page_obj = Paganation(current_page=request.GET.get('page',1),all_count=book_list.count()) 102 page_query = book_list[page_obj.start:page_obj.end] 103 # 將page_query,page_obj傳遞到前端便可 104 105 前端: 106 確保你的HTML頁面 引入了bootstrap文件 107 # for循環page_query 展現數據 108 # page_obj.page_html|safe生成分頁器頁碼樣式
1 02 多對多三種建立方式.mp4 2 03 forms組件簡介.mp4 3 04 forms組件校驗功能.mp4 4 05 forms組件三種渲染方式.mp4 5 06 forms組件展現錯誤信息.mp4 6 07 forms組件鉤子函數使用.mp4 7 08 forms補充知識點.mp4 8 09 forms組件源碼分析.mp4 9 10 cookie與session簡介.mp4 10 11 cookie操做.mp4 11 12 session操做.mp4
1 1.多對多建立方式: 2 1.全自動(推薦使用) 3 優點:不須要你手動建立第三張表 4 不足:因爲第三張表不是你手動建立的 也就是說第三張表字段是固定,沒法作擴展 5 class Book(models.Model): 6 title = models.CharField(max_length=32) 7 price = models.DecimalField(max_digits=8,decimal_places=2) 8 # digits 數字 decimal_places 小數位數 9 authors = models.ManyToManyFiled(to='Author') 10 11 class Author(models.Model): 12 name = models.CharField(max_length=32) 13 14 2.純手動(瞭解便可) 15 本身建立第三張表 16 優點: 第三張表能夠任意的擴展字段 17 不足:orm查詢不方便 18 class Book(models.Model): 19 title = models.CharField(max_length=32) 20 price = models.DecimalField(max_digits=8,decimal_places=2) 21 class Author(models.Model): 22 name = models.CharField(max_length=32) 23 24 class Book2Author(models.Model): 25 book = models.ForeignKey(to='Book') 26 author = models.ForeignKey(to='Author) 27 create_time = models.DataField(auto_now_add=True) 28 29 3.半自動(推薦使用****) 30 優點:結合了全自動和純手動的兩個優勢 31 class Book(models.Models): 32 title = models.CharField(max_length=32) 33 price = models.DecimalField(max_digits=8,decimal_places=2) 34 authors = models.ManyToManyFields=('book','author') 35 # through 告訴django orm 書籍表he做者表的多對多關係 經過Book2Author來記錄的 36 # through_fields 告訴django orm記錄關係時用過Book2Author 表中的book字段和author字段來記錄的 37 38 """ 39 多對多字段的 add set remove clear 不支持 40 """ 41 class Author(models.Model): 42 name = models.CharField(max_length=32) 43 # books = models.ManyToManyField(to='Book',through='Book2Author',through_field=('author','book')) 44 45 class Book2Author(models.model): 46 book = models.Foreignkey(to='Book') 47 author = models.Foreignkey(to='Author') 48 create_time = models.DateField(auto_now_add=True)
1 2.forms組件 2 本身手動實現一個註冊功能 3 當用戶的用戶名包含 '金並瓦梅' 提示不符合社會主義核心價值觀 4 當用戶的密碼短於3位 提示密碼過短 不符合要求 5 6 1.思路分析 7 1.前端頁面搭建 >>> 渲染頁面 8 2.校驗數據是否合法 >>> 校驗數據 9 3.展現錯誤信息 >>> 展現信息 10 2.forms組件的基本用法 11 1.寫一個繼承了forms.Form的類 12 from django import forms 13 class LoginForm(forms.Form): 14 username = forms.CharField(max_length=8,min_length=3) # 用戶名最長八位數 最短三位數 15 password = forms.CharField(max_length=8,min_length=5) # 密碼最長八位 ,最短五位 16 email = forms.EmailField() # email 必須是郵箱格式 17 18 2.基本使用 (點擊下角 Python console) 19 from app01 import views 20 1.校驗功能: 21 將須要校驗的數據 以字典的方式 傳遞給自定義的類 實例化產生對象 22 form_obj = views.LoginForm({'username':'jason','password':'123','email':'123'}) 23 2.如何查看數據是否合法 24 form_obj.is_valid() # 指定全部的數據都符合要求 纔會是True 25 反之 false 26 3.如何查看錯誤 緣由 27 form_obj.errors 28 { 29 'password': ['Ensure this value has at least 5 characters (it has 3).'], 30 'email': ['Enter a valid email address.'] 31 } 32 4.如何查看經過校驗的數據 33 form_obj.cleaned_data 34 {'username':'jason'} 35 ps: 36 1.自定義類中全部的字段默認都必需要傳值的 37 2.能夠額外傳入類中沒有定義的字段名 forms組件 不會去校驗 也就意味着 多傳 一點關係也沒有 38 form_obj = views.LoginForm({'username':'jason','password':'123456','email':'123@qq.com'}) 39 form_obj.is_valid() 40 True 41 42 form_obj = views.LoginForm({'username':'jason','password':'123456'}) 43 form_obj.is_valid() 44 False 45 46 form_obj = views.LoginForm({'username':'jason','password':'123456','email':'123@qq.com','hobby':'read'}) 47 form_obj.is_valid() 48 True 49 50 3.渲染頁面 51 forms字段的三種渲染方式: 52 1.方法一 53 <p>第一種渲染頁面的方式</p> 54 {{form_obj.as_p}} 55 {{form_obj.as_ul}} 56 {{form_obj.as_table}} 57 58 2.方法二 59 <p>第二種渲染頁面的方式(可擴展性較高 書寫麻煩)</p> 60 <p>{{form_obj.username.label}}{{form_obj.username}}</p> 61 <p>{{form_obj.password.label}}{{form_obj.password}}</p> 62 <p>{{form_obj.email.label}}{{form_obj.email}}</p> 63 3.方法三 64 {% for foo in form_obj %} 65 <p>{{foo.label}}{{foo}}</p> 66 {% endfor %} 67 68 ps: 69 1.forms組件在幫你渲染頁面的時候 只會渲染獲取用戶輸入的標籤 提交按鈕須要你手動添加 70 2.input框 的label註釋 不指定的狀況下 默認用類中字段的首字母大寫 71 3.校驗數據的時候能夠先後端都校驗 作一個雙重校驗, 72 可是前段的校驗無關緊要 然後端的校驗則 必需要有 由於前端的校驗能夠經過爬蟲直接避開 73 4.前端取消瀏覽器校驗功能 74 form標籤指定 novalidate屬性便可 75 <form action="" method="post" novalidate></form> 76 77 4.forms組件展現錯誤信息 78 required=False 容許爲空 79 前端: 80 {% for foo form_obj %} 81 <p>{{foo.label}}:{{foo}} 82 <span> {{foo.errors.0}}</span> 83 </p> 84 {% endfor %} 85 後端代碼: 86 password = forms.CharField(max_length=8,min_length=5,label='密碼',error_messages={ 87 'max_length':'密碼最大八位', 88 'min_length':'密碼最小五位', 89 'required':'密碼不能爲空', 90 },required=False,validators=[RegexValidator(r'^[0-9]+$',數字必須以159開頭)]) # 密碼最長八位最短五位 91 92 5..鉤子函數 93 forms組件暴露給用戶 能夠自定義的校驗規則 94 局部鉤子 ,針對一個字段作額外校驗 95 全局鉤子,針對多個字段作額外校驗 96 97 用法:在自定義的form類中書寫方法便可 98 # 局部鉤子(針對某一個字段作額外的校驗) 99 例:檢驗用戶名中 不能包含666 一旦包含 提示 100 def clean_username(self): 101 username = self.cleaned_data.get('username') 102 if '666' in username: 103 self.add_error('username','光喊666是不行的 你得本身上') 104 return username 105 # 全局鉤子(針對多個字段作額外的校驗) 106 例:校驗用戶兩次密碼是否一致 107 def clean(self): 108 password = self.cleaned_data.get('password') 109 confirm_password = self.cleaned_data.get('confirm_password') 110 if not password == confirm_password: 111 self.add_error('confirm_password','兩次密碼不一致') 112 return self.cleaned_data 113 6.forms組件及其餘操做(***) 114 1.required 是否必填 115 2.label 註釋信息 116 3.error_messages 報錯信息 117 4.initial 默認值 118 5.widget 控制標籤屬性和樣式 119 widget = widgets.PasswordInput() 120 控制標籤屬性 121 widget = widgets.PasswordInput(attrs={'class':'form-control c1 c2','username':'jason'}) 122 123 瞭解: 124 1.radio 單選radio框 125 gender = forms.ChoiceField( 126 choices=((1, "男"), (2, "女"), (3, "保密")), 127 label="性別", 128 initial=3, 129 widget=forms.widgets.RadioSelect() 130 ) 131 2.單選的select框 132 hobby = forms.ChoiceField( 133 choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),), 134 label="愛好", 135 initial=3, 136 widget=forms.widgets.Select() 137 ) 138 3.多選的select框 139 hobby1 = forms.MultipleChoiceField( 140 choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),), 141 label="愛好", 142 initial=[1, 3], 143 widget=forms.widgets.SelectMultiple() 144 ) 145 4.checkbox 單選 146 keep = forms.ChoiceField( 147 label="是否記住密碼", 148 initial="checked", 149 widget=forms.widgets.CheckboxInput() 150 ) 151 5.checkbox 多選 152 hobby2 = forms.MultipleChoiceField( 153 choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),), 154 label="愛好", 155 initial=[1, 3], 156 widget=forms.widgets.CheckboxSelectMultiple() 157 7.foems組件源碼分析: 158 form_obj.is_valid() 159 form_obj.cleaned_data 160 form_obj.errors()
1 2.cookie 與 session 2 3 因爲http協議 是無狀態的,沒法記錄用戶狀態 因此致使cookie,session的產生 4 5 6 cookie 就是保存在客戶端瀏覽器上的鍵值對 7 工做原理: 8 當你登陸成功後,瀏覽器上會保存一些信息 9 下次再訪問的時候 就會帶着這些信息去訪問 服務端 服務端 經過這些來判斷識別出你的身份 10 11 cookie雖然是寫在客戶端瀏覽器上的 可是 是 服務端 設置的 12 瀏覽器能夠選擇不服從命令 禁止寫cookie 13 14 15 session 就是保存在服務器上的鍵值對 16 session雖然是保存在服務器上的鍵值對 17 可是它是依賴於cookie 工做的 18 19 服務端返回給瀏覽器一個隨機的字符串 20 瀏覽器以鍵值對的形式保存 21 sessionid:隨機字符串 22 23 瀏覽器在訪問服務端時 就會將隨機字符串攜帶上 24 後端獲取隨機串與後端的記錄做對比 25 隨機字符串1:數據1 26 隨機字符串2:數據2 27 28 29 1.如何操做cookie 30 django返回給客戶端瀏覽器的都必須是HttpResponse對象 31 return HttpResponse() 32 return render() 33 return redirect() 34 35 obj1 = HttpResponse() 36 return obj1 37 obj2 = render() 38 return obj2 39 obj3 = redirect() 40 return obj3 41 42 2.cookie方法: 43 設置cookie利用的就是HttpResponse對象 44 obj1 = HttpResponse() 45 obj1.set_cookie('k1','v1') 46 47 # 獲取cookie 48 request.COOKIE.get() 49 50 # 刪除cookie 51 obj1.delete_cookie('k1') 52 53 # 設置超時時間 54 max_age=None,超時時間 55 expires=None,超時時間(IE requires expires, so set it if hasn't been already.) 56 57 登陸功能 58 59 60 3.session方法 61 1.設置session 62 request.session['name'] = 'jason' 63 """ 64 上面這一句話發生了三件事 65 1.django內部自動生成一個隨機字符串 66 2.將隨機字符串和你要保存的數據 寫入django_session表中(如今內存中生成一個緩存記錄 等到通過中間件的時候纔會執行) 67 3.將產生的隨機字符串發送給瀏覽器 寫入 cookie 68 sessionid:隨機字符串 69 """ 70 2.獲取session 71 request.session.get('name') 72 """ 73 上面 這句話一共發生了三件事 74 1.django內部會自動從請求 信息中獲取到隨機字符串 75 2.拿着隨機字符串去django_session表中比對 76 3.一旦對應上了就將對應的數據解析出來 放到request.session中 77 """ 78 django session 默認的超時時間是14天 79 django_session表中的一條記錄針對一個瀏覽器 80 81 3.刪除當前會話中全部session數據 82 request.session.delete() # 刪除的是瀏覽器的sessionid 信息 83 84 # 刪除當前的會話數據並刪除會話的cookie 85 request.session.flush() # 將瀏覽器和服務端所有刪除 86 這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問 87 例如: 88 django.contrib.auth.logout() 函數中就會調用它 89 90 # 設置會話Session和Cookie的超時時間 91 # set_expiry 美國時間(8:00) 和 北京時間(16:00)差距 八小時 92 request.session.set_expiry(value) 93 * 若是value是個整數 session會在顯秒數後失效 94 * 若是value是個datatime 或 timedelta,session就會在這個時間後失效 95 * 若是value是0 用戶關閉瀏覽器session就會失效 96 * 若是value是None,session會依賴全局session失效策略 97 總結:你在後期能夠將一些數據保存到session表中,保存的數據 能夠在後端任意位置獲取到
做業 基於session完整登錄校驗