django第四天上课总结
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 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 364 365 366 367 | day17 ###1. 内容回顾 - 1.orm - 参数 - null blank default ( ( 1 , '男' ),() ) - 1. 必知必会 13 条 - 1. 返回对象列表 - all () - filter () - exclude() - values() {} - values_list( 'id' , 'name' ) () - order_by() - - reverse() - distinct() - 2. 返回对象 - get() - first() - last() - 3. 返回数字 - count() - 4. 返回布尔值 - exists() - 2. 单表的双下划线 - __gt lt gte lte - __in = [] __range = [] - __contains like __icontains 忽略大小写 - __startswith __endswith - __istartswith __iendswith - __isnull = True - 3. 外键 - 表示多对一的关系 - BooK: - pub = models.ForeignKey(Publisher, on_delete = models.CASCADE,null = ) - book_obj.pub _> 所关联的对象 - book_obj.pub_id - book_obj.pub.name - 没有设置related_name - pub_obj.book_set _> 关系管理对象 - pub_obj.book_set. all () - 设置related_name = 'books' - pub_obj.books. all () - models.BooK.objects. filter (pub__name = 'xxx' ) - models.Publisher.objects. filter (book__name = 'xxx' ) - 4. 多对多 - 表示多对多的关系 - book - author - author - book_obj.author _> 关系管理对象 - book_obj.author. all () - book_obj.author. set ([]) [对象,对象] [ id , id ] - book_obj.author.add() 对象,对象 id , id - book_obj.author.remove() - book_obj.author.clear() - book_obj.author.create() 创建一个作者 - 5. 聚合和分组 ```python from django.db.models import Max , Min , Sum ,Avg,Count models.Book.objects.aggregate( max = Max ( 'price' )) { 'max' : 100 } models.Author.objects.annotate( Max ( 'books__price' )).values() 对象列表 models.Book.objects.values( 'author' ).annotate( Max ( 'price' )) ``` - 6.F Q - filter (sale__gt = F( 'store' )) - update(sale = F( 'sale' ) * 2 + 13 ) - Q(Q(id__gt = 1 ) | Q(id__lt = 5 )) Q() - & | ~ - 7. 事务 - begin; - commit; ```python from django.db import transaction import time try : with transaction.atomic(): # 一系列操作 models.Publisher.objects.create(name = 'xxxxxx' ) except Exception as e: print (e) ``` - 2.cookie session - 1.cookie - 保存在浏览器上的一组组键值对 - 设置 - response.set_cookie(key,value, max - age = 5 ) - 获取 - request.COOKIES [] .get - 删除 - response.delete_cookie(key) - 2.session - 保存在服务器上的一组组键值对,依赖cookie - request.session[k] = v - request.session[k] - request.session.delete() - request.session.flush() ###2. 今日内容 - 1. 中间件 - https: / / www.cnblogs.com / maple - shaw / articles / 9333824.html - 中间件就是一个类,处理django的请求和响应.五个方法 - 参数 执行的时间 执行的顺序 返回值 - process_request( self , request) - 参数: - request 跟视图函数中request同一个 - 执行时间: - 视图函数执行之前,也在路由匹配之前 - 执行顺序: - 按照注册顺序 顺序 执行 - 返回值: - None : 正常流程 - HttpResponse: - 当前中间件之后的中间件的process_request 路由匹配 视图函数 都不执行 - 直接执行当前中间件中的process_response方法,剩下正常流程将结果返回给浏览器 - process_response( self , request,response) - 参数: - request 跟视图函数中request同一个 - response response对象 - 执行时间: - 视图函数执行之后 - 执行顺序: - 按照注册顺序 倒序 执行 - 返回值: - HttpResponse: 必须返回HttpResponse对象 - process_view( self , request, view_func, view_args, view_kwargs) - 参数: - request 跟视图函数中request同一个 - view_func 视图函数 - view_args 传递给视图函数的位置参数 - view_kwargs 传递给视图函数关键字置参数 - 执行时间: - 视图函数执行之前,也在路由匹配之后 - 执行顺序: - 按照注册顺序 顺序 执行 - 返回值: - None : 正常流程 - HttpResponse: - 当前中间件之后的中间件的process_view 视图函数 都不执行 - 直接执行最后一个中间件中的process_response方法,剩下正常流程将结果返回给浏览器 - process_exception( self , request, exception): - 参数: - request 跟视图函数中request同一个 - exception 错误对象 - 执行时间(触发条件): - 视图出错后才执行 - 执行顺序: - 按照注册顺序 倒序 执行 - 返回值: - None : 正常流程 交给下一个中间件处理异常 都不处理交给django处理 - HttpResponse: - 当前中间件之后的中间件的process_exception都不执行 - 直接执行最后一个中间件中的process_response方法,剩下正常流程将结果返回给浏览器 - process_template_response( self , request, response): - 参数: - request 跟视图函数中request同一个 - response template_response对象 - 执行时间(触发条件): - 视图函数返回的是template_response对象 - 执行顺序: - 按照注册顺序 倒序 执行 - 返回值: - HttpResponse: 必须返回template_response对象 - 2.ajax - https: / / www.cnblogs.com / maple - shaw / articles / 9524153.html - 发请求的方式: - 1. 浏览器地址上输入地址 GET - 2.form 表单 GET / POST - 3.a 标签 GET - ajax js的技术,发送请求,传输的数据 json xml - 局部刷新 异步 - 1. 计算示例 - [] + [] = [] ```javascript $.ajax({ url: '/calc/' , type : 'post' , data: { a1: $( 'input[name="ii1"]' ).val(), a2: $( 'input[name="ii2"]' ).val(), }, success: function (ret) { $( 'input[name="ii3"]' ).val(ret) } }) ``` - 2.ajax 参数介绍 ```javascript $.ajax({ url: '/upload/' , / / 上传的地址 type : 'post' , / / 请求的类型 processData: false, / / 告诉jQuery不要去处理发送的数据 contentType: false, / / 告诉jQuery不要去设置Content - Type 请求头 data: form_data, / / 数据 {} success: function (ret) { console.log(ret) }, error: function (ret) { alert(ret) } }) ``` - 3. 提交post请求的设置 - 前提 有csrftroken的cookie - 1.data 中添加 csrfmiddlewaretoken 键值对 - 2.headers : { 'x-csrftoken' : $( 'input[name="csrfmiddlewaretoken"]' ).val(), } - 3. 引入文件 - 3.form 组件 - https: / / www.cnblogs.com / maple - shaw / articles / 9537309.html - form组件的作用: - 1. 自动生成 input 框 - 2. 可以对数据进行校验 - 3. 有错误提示 - 1. 注册示例 - 2.form 组件的使用 ```python class RegForm(forms.Form): username = forms.CharField(label = '用户名' ,min_length = 6 ) password = forms.CharField(label = '密码' ,widget = forms.PasswordInput) ``` - 视图: ```python form_obj = RegForm() form_obj = RegForm(request.POST) form_obj.is_valid() # 对数据进行校验的 form_obj.cleaned_data # 只有通过校验的数据 return render(request, 'reg.html' , { 'form_obj' : form_obj}) ``` - 模板: - {{ form_obj.as_p }} 演示使用 - {{ form_obj.username }} input 框 - {{ form_obj.username.label }} label的值 - {{ form_obj.username.id_for_label }} input 框的 id - {{ form_obj.username.errors }} 当前字段的所有的错误 - {{ form_obj.username.errors. 0 }} 当前字段的第一个的错误 - {{ form_obj.non_field_errors }} __all__ 全局的错误 - 3. 字段及参数的介绍 - CharField - ChoiceField - MultipleChoiceField - required = True , 是否允许为空 - widget = None , HTML插件 - label = None , 用于生成Label标签或显示内容 - initial = None , 初始值 - help_text = '', 帮助信息(在标签旁边显示) - error_messages = None , 错误信息 { 'required' : '不能为空' , 'invalid' : '格式错误' } - validators = [], 自定义验证规则 - disabled = False , 是否可以编辑 - 4. 内置校验和自定义校验 - required - max_length - min_length - 1. 使用内置的校验器 ```python from django.core.validators import RegexValidator phone = forms.CharField( validators = [RegexValidator(r '^1[3-9]\d{9}$' , '手机号格式不正确' )], ) ``` - 2. 自定义函数 ```python from django.core.exceptions import ValidationError def check_username(value): if 'alex' in value: raise ValidationError( '用户名含有非法字符,请重新选择' ) ``` - 5.is_valid 源码解析及局部、全局钩子 ```python def clean_username( self ): #局部钩子 对当前字段做校验 # 通过校验 返回当前的字段的值 # 不通过校验 抛出异常ValidationError pass def clean( self ): # 全部钩子 对任意字段做校验 # 通过校验 返回所有字段的值 # 不通过校验 抛出异常ValidationError __all__ password = self .cleaned_data.get( 'password' ) re_password = self .cleaned_data.get( 're_password' ) if password = = re_password: return self .cleaned_data self .add_error( 're_password' , '两次密码不一致!!!!' ) raise ValidationError( '两次密码不一致' ) ``` |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步