一、回顾总结
https://www.cnblogs.com/maple-shaw/articles/9323320.html
1. 视图 1. CBV 和 FBV from django.views import View class AddPublisher(View): def dispatch(self, request, *args, **kwargs): ret = super().dispatch(request, *args, **kwargs) return ret def get(self,request): pass def post(self,request): pass 使用: url(r'^add_publisher/', views.AddPublisher.as_view()), 2. CBV的简单的流程 1. AddPublisher.as_view()得到一个view函数 url(r'^add_publisher/', view), 2. 请求到来的时候 执行view: 1. 实例化AddPublisher的类,赋值给self 2. 执行dispatch方法 3. 通过反射获取到get或者post的方法 4. 执行get或者post方法,返回HttpResponse对象 3. 装饰器的使用 1. FBV 正常使用 @装饰器 2. CBV from django.utils.decorators import method_decorator 1. 给get或者post方法加 2. 给dispatch方法加 3. 给类加(写name='get') 4. request request.method 请求方法 GET POST request.GET URL传参 {} request.POST form表单传的参数 request.body 请求体 request.FILES 上传的文件 request.path_info URL路径 不包含域名和URL参数 request.get_full_path() URL路径包含URL参数 request.get_host() 获取IP和端口 5. response 1. HttpResponse('字符串') —》 页面看到的就是字符串 content—type: text/html;charset=utf8 2. render(request,'HTML文件名',{参数}) ——》返回一个页面 3. redirect('/index/') 跳转 重定向 返回一个响应头 Location:'/index/' 4. JsonResponse(字典) content—type: application/json 返回列表时 safe=False JsonResponse(data,safe=False) 2. 路由 1. from django.conf.urls import url urlpatterns =[ url(正则表达式,视图,参数,name) url(正则表达式,视图,参数,name) url(正则表达式,视图,参数,name) ] 2. 正则表达式 加$ [0-9] /d + 一个或多个 ?0个或1个 * 0个或多个 . 除了换行符的所有 3. 分组和命名分组 url(r'book/[0-9]{4}/[0-9]{2}/',views.book) 无名分组: url(r'book/([0-9]{4})/([0-9]{2})/',views.book) 按照位置传参的方式传给视图 命名分组 url(r'book/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/',views.book) 按照关键字传参的方式给视图 捕获到的参数都是字符串 4. 命名url和url的反向解析 url(r'home',view,home,name='home') url(r'book/([0-9]{4})/([0-9]{2})/',views.book,name='book') url(r'book/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/',views.book,name='book2') 视图中反向解析URL: from django.shortcuts import reverse reverse('home') ——》 /home/ reverse('book',args=('1999','08')) ——》/book/1999/08/ reverse('book2',kwargs={'year':'1998','month':'08'}) ——》 /book/1998/08/ 模板中反向解析URL: {% url 'home' %} ——》 /home/ 无名分组: {% url 'book' '1999' '08' %} ——》/book/1999/08/ 有名分组: {% url 'book' '1999' '08' %} ——》/book/1999/08/ {% url 'book' year='1999' month='08' %} ——》/book/1999/08/ {% url 'book' month='08' year='1999' %} ——》/book/1999/08/ 5. include from app01 import urls as app01_urls from app02 import urls as app02_urls url('app01/', include(app01_urls)), url('app02/', include(app02_urls)) url('app01/', include('app01.urls')), url('app02/', include('app02.urls')) 5. namespace 3. ORM 1. mysql的配置 1. 创建mysql数据库 2. settings配置 ENGINE: 'mysql' NAME: '数据库名称' HOST:IP PORT: 3306 USER: 'root' PASSWORD: '' 3. 告诉django使用pymysql来连接mysql数据库 在项目同名的文件夹下的__init__.py中写: import pymysql pymysql.install_as_MySQLdb() 4. 创建model class Person(models.Model) name = models.CharField(max_length=32) 5. 执行两条数据库命令 python manage.py makemigrations # 记录models的变更记录 python manage.py migrate # 把变革记录更新到数据库中 2. ORM操作 1. 查 models.Person.objects.all() # 查所有 models.Person.objects.get(id=1,name='xxx') # 查一个对象 满足条件的 models.Person.objects.filter(id=1,name='xxx') # 查询满足条件的所有对象 列表 models.Person.objects.filter(id=1,name='xxx').order_by('id') 属性: pub_obj.name 外键的 book book_obj.name book_obj.publisher ——》 这是书籍关联的出版社对象 book_obj.publisher_id ——》 这是数据库存的数据 book_obj.publisher.id book_obj.publisher.name 多对多 author author.name author.books ——》 多对多的管理对象 author.books.all() 所有作者关联的书籍对象列表 2. 增加: models.Publisher.objects.creatte(name='xxxx') 外键 models.Book.objects.creatte(name='xxxx',publisher=pub_obj) models.Book.objects.creatte(name='xxxx',publisher_id=pub_obj.id) 多对多 author_obj = models.Author.objects.creatte(name='xxx') author_obj.books.set([1,2,3]) 3. 删除 models.Publisher.objects.get(id=1).delete() models.Publisher.objects.filter(id=1).delete 4. 修改 pub_obj.name = new_name pub_obj.save() book_obj.name= new_name book_obj.publisher = new_pub_obj book_obj.publisher_id = 2 book_obj.save() author_obj.name=new_name author_obj.save() author_obj.books.set([1,2])
二、预习和拓展
1.上台阶问题
def f(n): if n ==1: return 1 elif n==2: return 2 elif n ==3: return 4 return f(n-1) + f(n-2) + f(n-3)
2. 自定义固定长度char字段
class MyCharField(models.Field): def __init__(self,max_length,*args,**kwargs): self.max_length = max_length super(MyCharField,self).__init__(max_length,*args,**kwargs) def db_type(self,connection): return "char(%s)" % self.max_length
cname
=
MyCharField(max_length
=
25
)