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)