1.多對多三種建立方式2forms組件3cookie和session # 58

今日內容總結
0.昨日內容回顧

  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生成分頁器頁碼樣式
0.昨日內容回顧

 

今日內容

 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 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)
多對多三種建立方式

 

2.form組件

  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()
forms組件

 

 


3.cookie和session

 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表中,保存的數據 能夠在後端任意位置獲取到
cookie和session

 



做業

做業   基於session完整登錄校驗
相關文章
相關標籤/搜索