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. 事务

  • 相关阅读:
    OK335x mksd.sh hacking
    Qt jsoncpp 对象拷贝、删除、函数调用 demo
    OK335xS 256M 512M nand flash make ubifs hacking
    Qt QScrollArea and layout in code
    JsonCpp Documentation
    Qt 4.8.5 jsoncpp lib
    Oracle数据库生成UUID
    freemarker得到数组的长度
    FreeMarker中if标签内的判断条件
    freemarker语法
  • 原文地址:https://www.cnblogs.com/kingon/p/9432077.html
Copyright © 2011-2022 走看看