1 上周内容回顾
2 常用字段
3 DateField
4 DateTiemField
5 auto_now
6 auto_now_add
7
8 EmailField
9
10 CharField
11
12 IntegerField
13
14 AutoField
15 primary_key = True
16
17
18 null
19 default
20
21
22 OneToOne
23 ForeignKey
24 ManyToMany
25 to
26
27
28
29
30
31
32 models中所有的字段类型都没有实际的约束作用
33 但是虽然写在models中没有限制作用,但是它们对于校验性组件
34 是非常有用的
35
36
37
38 自定义char字段
39 class MyCharField(models.Field):
40 def __init__(self,max_length,*args,**kwargs)
41 self.max_length = max_length
42 super().__init__(max_length=max_length,*args,**kwargs)
43
44 def db_type(self,connection):
45 return 'char(%s)'%self.max_length
46
47 class User(models.Model):
48 username = MyCharField(max_length=32)
49
50
51
52 查询优化(面试)
53 only('name')
54 defer('name')
55 这哥俩是一对相反的关系调用它们都能得到一个套有对象的列表
56
57
58 select_related
59 内部自动连表然后操作
60 先将表拼接起来
61 然后一次性将拼接表的数据全部查出来给你封装到对象中
62
63 prefetch_related
64 内部走了好几次数据库
65
66 事务
67 from django.db import transction
68 try:
69 with transction.automic():
70 # 事务操作
71 except BaseException as e:
72 print(e)
73 # 正常代码
74
75
76 图书管理系统
77 增删改查
78
79
80 今日内容
81 choices参数
82
83 用户性别
84 用户学历
85 工作状态
86 客户来源
87 是否结婚
88
89 username gender
90 jason 1
91
92
93
94 MTV与MVC模型
95 django框架 自称为是MTV框架
96 M:models
97 T:templates
98 V:views
99
100 MVC
101 M:models
102 V:views
103 C:controller 控制器(urls)
104 本质:MTV其实也是MVC
105
106
107
108
109
110
111
112
113 Ajax
114 异步提交 局部刷新
115 请求方式 GET POST
116 a标签href属性 GET请求
117 浏览器窗口输入url GET请求
118 form表单 GET/POST
119 ajax GET/POST
120
121 首先ajax这门技术 是js中的
122 但是原生的js操作ajax比较繁琐,我们这里为了提高效率
123 直接使用jQuery封装版本的ajax
124
125
126
127 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
128 (这一特点给用户的感受是在不知不觉中完成请求和响应过程)
129
130
131 小例子
132 页面上有三个input框
133 在前两个input框中输入数字
134 点击按钮 发送ajax请求 不刷新页面的情况下
135 第三个框中自动算出两数之和
136
137 $('#b1').on('click',function () {
138 {#alert(123)#}
139 // 点击按钮 朝后端发送post请求
140 $.ajax({
141 url:'', // 控制发送给谁 不写就是朝当前地址提交
142 type:'post', // 发送方式是post请求
143 data:{'i1':$('#i1').val(),'i2':$('#i2').val()}, // 发送的数据
144 success:function (data) { // data形参用来接收异步提交的结果
145 {#alert(data)#}
146 // 将后端计算好的结果 通过DOM操作 渲染到第三个input矿中
147 $('#i3').val(data)
148 }
149 })
150 })
151
152
153 contentType前后端传输数据编码格式
154 前后端传输数据编码格式
155 1.urlencoded
156 2.formdata
157 3.json
158
159 form表单
160 默认使用的编码格式是urlencoded
161 数据格式:name=jason&pwd=123
162 django后端针对urlencoded编码格式的数据会自动解析并放到request.POST中供用户获取
163
164 可以修改为formdata 传文件
165 django后端针对只要是符合urlencoded编码格式的数据(name=jason&pwd=123)都会自动解析并放到request.POST中供用户获取
166 如果是文件 只要你指定的编码是formdata 就会自动解析并放到request.FILES中
167 总结:前后端传输数据的时候 一定要保证数据格式和你的编码格式是一致的 不能骗人家!!!
168
169 ajax提交数据
170 ajax默认数据提交方式也是urlencoded
171
172 ajax发送json格式数据
173 django后端针对json格式的数据 并不会自动解析放到request.POST或者request.FILES里面
174 它并不会解析json格式数据 而是将它原封不动的放在request.body中了
175 $('#b1').on('click',function () {
176 alert(123)
177 // 点击按钮 朝后端发送post请求
178 $.ajax({
179 url:'', // 控制发送给谁 不写就是朝当前地址提交
180 type:'post', // 发送方式是post请求
181 data:JSON.stringify({'username':'jason','password':123}), // 发送的数据
182 contentType:'application/json', // 告诉后端你这次的数据是json格式
183
184 success:function (data) { // data形参用来接收异步提交的结果
185 alert(data)
186 // 将后端计算好的结果 通过DOM操作 渲染到第三个input矿中
187 $('#i3').val(data)
188 }
189
190 })
191 // {)
192 ajax传输文件
193 // ajax传输文件
194 $('#b1').on('click',function () {
195 // ajax传输文件 建议使用内置对象formdata
196 var formData = new FormData(); // 既可以传普通的键值对 也可以传文件
197 // 添加普通键值
198 formData.append('username','jason');
199 formData.append('password','123');
200 // 传文件
201 // 如何获取文件标签所存储的文件对象? 固定语法
202 // 1.先用jQery查找到存储文件的input标签
203 // 2.将jQuery对象转成原生js对象
204 // 3.利用原生js对象的方法 .files[0]获取到标签内部存储的文件对象
205 // 4.一定要指定两个参数都为false
206 formData.append('my_file',$('#d1')[0].files[0]);
207 $.ajax({
208 url:'', // 控制发送给谁 不写就是朝当前地址提交
209 type:'post', // 发送方式是post请求
210 data:formData, // 发送的数据
211
212 // ajax发送文件需要指定两个额外的参数
213 processData:false, // 告诉前端不要处理数据
214 contentType:false, // 不适用任何编码 因为formdata对象自身自带编码 django后端也能够识别formdata对象
215
216 success:function (data) { // data形参用来接收异步提交的结果
217 {#alert(data)#}
218 // 将后端计算好的结果 通过DOM操作 渲染到第三个input矿中
219 $('#i3').val(data)
220 }
221
222 })
223 })
224
225
226
227 序列化组件
228
229 from django.core import serializers # django自带的一个小型的序列化工具
230 def reg(request):
231 user_list = models.User.objects.all()
232 res = serializers.serialize('json',user_list)
233 return render(request,'index.html',locals())
234
235 [{
236 "model": "app01.user",
237 "pk": 1,
238 "fields": {
239 "username": "jason",
240 "age": 18,
241 "gender": 1
242 }
243 }, {
244 "model": "app01.user",
245 "pk": 2,
246 "fields": {
247 "username": "tank",
248 "age": 24,
249 "gender": 3
250 }
251 }, {
252 "model": "app01.user",
253 "pk": 3,
254 "fields": {
255 "username": "egon",
256 "age": 73,
257 "gender": 2
258 }
259 }, {
260 "model": "app01.user",
261 "pk": 7,
262 "fields": {
263 "username": "kevin",
264 "age": 29,
265 "gender": 4
266 }
267 }]
268
269
270
271 sweetalert搭建页面
272
273 自定义分页器
274 1 bulk_create() 批量插入数据
275 # for i in range(1000):
276 # models.Book.objects.create(title='第%s本书'%i)
277 # 上面这种方式 效率极低
278
279 l = []
280 for i in range(10000):
281 l.append(models.Book(title='第%s本书'%i))
282 models.Book.objects.bulk_create(l) # 批量插入数据
283
284
285 自定义分页器的使用
286 后端代码
287 book_list = models.Book.objects.all()
288 current_page = request.GET.get("page",1)
289 all_count = book_list.count()
290 page_obj = Pagination(current_page=current_page,all_count=all_count,per_page_num=10,pager_count=5)
291 page_queryset = book_list[page_obj.start:page_obj.end]
292 前端代码
293 {% for book in page_queryset %}
294 <p>{{ book.title }}</p>
295 {% endfor %}
296 {{ page_obj.page_html|safe }}
297
298
299
300 多对多表关系 三种创建方式
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363