day67 内容回顾 视图 1. CBV 定义 from django.views import View class Addpub(View): def get(self,request): self.request return response def post(self,request): return response 使用: from app01 import views url(r'^add_pub/',views.Addpub.as_view()) 2. as_view()的流程: 1. Addpub.as_view()执行 ——》 view函数 2. 请求到来的时候,执行view函数: 1. Addpub(*。**)——》 self 2. self.request = request 3. 执行self.dispatch(request.*args,**kwargs) ——》 Addpub中有 执行自己的dispatch,没有执行父类的 1. 判断请求方式 http_method_names = [ 'get','post' ] 1. 允许: 通过反射获取到对应请求方式(get/post)对应的方法 ——》 handler 2. 不允许: http_method_not_allowed —— 》 handler 2. 执行handler ——》 返回response响应 3. 加装饰器的方式 from django.utils.decorators import method_decorator 1. 直接加在方法上 @method_decorator(timer) def get(self, request): 1. 加在dispatch方法上 @method_decorator(timer) def dispatch(self, request, *args, **kwargs): # start = time.time() ret = super().dispatch(request, *args, **kwargs) # print('所用时间:{}'.format(time.time() - start)) return ret 1. 加在类上 @method_decorator(timer, 'post') @method_decorator(timer, 'get') class AddPublisher(View): 4. request 对象 1. request .method ——》 请求方式 POST GET 2. request .GET ——》 url上携带的参数 3. request .POST ——》 POST请求提交的数据 4. request .body ——》 请求体 5. request .FILES ——》 上传的文件 1. enctype = 'mutlipart/form-data' 2. POST {% csrf_token %} 3. 使用文件对象 chunks() 6. request.path_info ——》 url路径 不包含IP和端口、参数 7. request.COOKIES 8. request.session 9. request.get_full_path() ——》 url路径 不包含IP和端口 包含参数 10. request.get_host() ——》 主机的ip和端口 11. request.is_ajax() ——》 是否是ajax请求 5. response对象 1. HttpResponse() ——》 返回字符串 Content-Type = 'text/html' 2. render(request,'HTML文件名',{ }) ——》 返回完整的HTML页面 3. redirect(‘要跳转的地址’) ——》 重定向 Location :地址 1. ret = HttpResponse('') ret['Location '] = ' 地址' 4. JsonRespinse(字典) JsonRespinse([] ,safe=False ) Content-Type = 'application/json' 路由 from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/$', views.blogs), # url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog), url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog), ] 正则 ^ $ asd d + ? * . 分组和命名分组 url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog), # 位置参数传参 url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog), # 关键字传参 从URL上捕获的参数是字符串 include —— 路由分发 urlpatterns = [ url(r'^app01/', include('app01.urls')), # url(r'^app02/', include('app02.urls')), # url(r'^', include('app01.urls')), ] urlpatterns = [ url(r'^publisher/', views.publisher), # url(r'^add_publisher/', views.add_publisher), url(r'^add_publisher/', views.AddPublisher.as_view()), # url(r'^add_publisher/', views.view), url(r'^del_publisher/(d+)/', views.del_publisher), url(r'^edit_publisher/', views.edit_publisher), url(r'^test/', views.test), ] 今日内容 1. url命名和反向解析 from django.urls import NoReverseMatch, reverse 普通URL: 命名: url(r'^blog/$', views.blogs, name='xxxxx'), 反向解析 视图中: reverse('xxxxx') ——》 ‘/blog/’ 模板中: {% url 'xxxxx' %} 分组: 命名: url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog, name='blog'), 反向解析 视图中: reverse('blog',args=('2019','01')) ——》 ‘/blog/2019/01/’ 模板中: {% url 'blog' '2018' '12' %} ——》 /blog/2018/12/ 分组: 命名分组: url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog, name='blog'), 反向解析 视图中: reverse('blog',args=('2019','01')) ——》 ‘/blog/2019/01/’ reverse('blog',kwargs={'year':'2018','month':12}) ——》 ‘/blog/2018/12/’ 模板中: {% url 'blog' '2018' '12' %} ——》 /blog/2018/12/ {% url 'blog' year='2018' month='12' %} ——》 /blog/2018/12/ {% url 'blog' month='12' year='2018' %} ——》 /blog/2018/12/ 2. namespace url('app01/', include('app01.urls', namespace='app01')), url('app02/', include('app02.urls', namespace='app02')) 视图: reverse('app01:home') 模板 {% url 'app01:home' %} ORM 类 ——》 表 对象 ——》 数据行 属性 ——》 字段 常用的字段 AutoField IntegerField BooleanField CharField DateTimeField DateField DecimalField FloatField 字段和model的参数 见博客 必知必会13条 见代码 单表的双下划线 ret = models.Person.objects.filter(pk__gt=100) # greater than ret = models.Person.objects.filter(pk__lt=103) # less than ret = models.Person.objects.filter(pk__gte=100) # greater than equal ret = models.Person.objects.filter(pk__lte=103) # less than equal ret = models.Person.objects.filter(pk__in=[100,103]) ret = models.Person.objects.filter(pk__gte=100,pk__lte=103) ret = models.Person.objects.filter(pk__range=[100,103]) ret = models.Person.objects.filter(name__contains='L') ret = models.Person.objects.filter(name__icontains='L') ret = models.Person.objects.filter(name__startswith='x') ret = models.Person.objects.filter(name__istartswith='X') ret = models.Person.objects.filter(name__endswith='x') ret = models.Person.objects.filter(name__iendswith='X') ret = models.Person.objects.filter(birth__contains='2019-01-24') ret = models.Person.objects.filter(age__isnull=False)