zoukankan      html  css  js  c++  java
  • Django CBV 装饰器 命名分组 反向解析

    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.create(name='xxxx',publisher=pub_obj)
        models.Book.objects.create(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. ORM 单表操作:
        1. create
        2. get
        3. delete
        4. 修改
          1. update() --> 只更新指定字段
          2.  obj.属性 = 值 --> 所有字段都更新
            obj.save()
        5. ORM外键操作
          1. 外键应该设置在哪一张表里 --> 通常放在多的那一边
          2. 正向查 .属性
          3. 反向查 表名_set.all()
        6. 多对多字段
          1. 多对多字段应该设置在哪一张表?
          2. 多对多的方法
            1. add
            2. set
            3. clear
            4. remove
        7. ORM进阶
          1. 聚合和分组
          2. F和Q
            1. F:字段与字段之间作比较的时候用F/使用原来字段的值做更新的时候
            2. Q: 对查询做并集操作时
          3. 事务

  • 相关阅读:
    【总结】搜索
    【luogu】p2296 寻找道路
    【luogu】p2058 海港
    【总结】二叉搜索树
    【总结】线段树
    【总结】矩阵快速幂
    【笔记】很基础的数论知识
    【总结】扩展欧几里得算法
    【总结】二分查找
    【高精度乘法】例1.4 课本185页
  • 原文地址:https://www.cnblogs.com/kingon/p/9432077.html
Copyright © 2011-2022 走看看