码农行者 码农行者
首页
  • Python

    • 语言特性
    • Django相关
    • Tornado
    • Celery
  • Golang

    • golang学习笔记
    • 对比python学习go
    • 模块学习
  • JavaScript

    • Javascript
  • 数据结构预算法笔记
  • ATS
  • Mongodb
  • Git
云原生
运维
垃圾佬的快乐
  • 数据库
  • 机器学习
  • 杂谈
  • 面试
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

DeanWu

软件工程师
首页
  • Python

    • 语言特性
    • Django相关
    • Tornado
    • Celery
  • Golang

    • golang学习笔记
    • 对比python学习go
    • 模块学习
  • JavaScript

    • Javascript
  • 数据结构预算法笔记
  • ATS
  • Mongodb
  • Git
云原生
运维
垃圾佬的快乐
  • 数据库
  • 机器学习
  • 杂谈
  • 面试
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Python

    • 语言特性

    • Django

      • Django 简单入门及最佳实践
      • Django学习笔记-url、视图
      • Django学习笔记-模型(1)模型的定义
      • Django学习笔记-模型(2)模型的操作
      • Django学习笔记-模板
      • Django 文章整理- 学习路径总结
      • Django 3.0 异步试用分享
      • Django 3.2 新功能尝鲜
      • Django admin 定制案例
      • Django 三个异步使用的案例
      • Django学习笔记- Class View
        • django 相关命令总结
        • django form表单的数据 select 值更新问题
        • Django自定义管理器(objects)后遇到的问题
        • django signal 使用总结
        • 单文件 Django 服务构建
        • 使用 supervisor 来监控 django celery
        • Django 中如何使用 sass
        • Django uwsgi 启动问题 unavailable modifier requested 0
        • Django uwsgi 启动问题 ImportError No module named os
      • Best.Practices.for.Django

      • Djangorestfulframework

      • Celery

      • Tornado

      • Flask

      • FastApi

      • virtualenv

    • Golang

    • Javascript

    • 开发语言
    • Python
    • Django
    DeanWu
    2016-03-24
    目录

    Django学习笔记- Class View

    提示:文章概念性语句比较多,建议先看 Classview 的官方文档 (opens new window)或1.8 中文翻译文档 (opens new window)。

    之前使用 django 开发都是使用 func-view ,对Classview一直是向往的。

    最近有些时间,看下Classview的用法,记录下,备查。

    # 0x01 使用目的及优势

    • HTTP 方法(GET、POST 等)可以有各自的方法,而不用通过条件分支来解决。

    • 面向对象的技术例如Mixin(多继承)可以将代码分解成可重用的组件。

    • 更好的利用 通用视图。(基于函数的通用视图难易扩展,基于类的可以通过 Mixin 来扩展,更加灵活)

    # 0x02 Classview 原理

    Django 的URL 解析器将请求和关联的参数发送给一个可调用的函数而不是一个类,所以基于类的视图有一个as_view() 类方法用来作为类的可调用入口。

    该as_view 入口点创建类的一个实例并调用dispatch() 方法。dispatch 查看请求是GET 还是POST 等等,并将请求转发给相应的方法,

    如果该方法没有定义则引发HttpResponseNotAllowed。

    # 0x03 用法筛记

    # Classview 中装饰器的用法

    • 在urlconf 中直接装饰 as_view() 函数。
    
    from django.contrib.auth.decorators import login_required, permission_required
    from django.views.generic import TemplateView
    
    from .views import VoteView
    
    urlpatterns = [
        url(r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
        url(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
    ]
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    • 使用 method_decorator 转化后直接装饰到 class 的方法上
    
        from django.contrib.auth.decorators import login_required
        from django.utils.decorators import method_decorator
        from django.views.generic import TemplateView
    
        class ProtectedView(TemplateView):
        
            template_name = 'secret.html'
    
            @method_decorator(login_required)
            def dispatch(self, *args, **kwargs):
                return super(ProtectedView, self).dispatch(*args, **kwargs)
                
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    # 0x04 扩展通用视图的方法

    • 在url 中直接传递参数,覆盖类属性,到达扩展的作用。

    • 编写其子类,覆盖其方法。

    # 0x05 通用视图基本用法要点总结

    • context_object_name 属性指定要使用的上下文变量,默认的是 object_list

    • model参数指定视图在哪个数据库模型之上进行操作

    • template 指定视图模板

    • 可以使用 get_context_data 指定额外的上下文变量

    • 可以使用 get_query 指定经过逻辑过滤的处理对象(queryset 同 model )

    • form_class 指定操作的Form

    # 0x06 常用视图解析

    # 1、通用模板视图 TemplateView

    ContextMixin 提供上线文context View 提供 as_view 函数 TemplateResponseMixin 返回TemplateResponse 对象,template 使用的是类属性 tempalte_name。

    # 2、通用列表视图 ListView和通用详情页视图 DetailView

    (原图片出处博客 (opens new window)中描述,直接搬过来了)

    在这两个类图中,最关键的组件就是MultiObjectMixin和SingleObjectMixin这两个类了,他们实现的功能是从数据库中读取数据,

    并且构建要传入template的context。每个类都有一些属性和方法可以覆盖,实现自定制,比如可以覆盖context_object_name变量,

    用来指定传入template的context的对象的变量名;可以覆盖get_context_data()方法,用来将其他的变量放到context中;

    为queryset赋值,就可以自己指定这个View操作的对象(列表);或者是直接重写get_queryset()/get_object()方法,简单暴力。

    注意,这两个类,也是继承自TemplateResponseMixin,也就是说它们也是直接返回的TemplateResponse对象。

    # 0x07 其他知识点

    • 对于每个请求都会实例化类的一个实例,但是as_view() 入口点设置的类属性只在URL 第一次导入时配置。

    • 只能继承一个通用视图 —— 也就是说,只能有一个父类继承View,其它的父类必须是Mixin

    • 你的视图扩展应该仅仅使用那些来自于同一组通用基类的view或者mixins

    # 参考

    http://blog.csdn.net/hackerain/article/details/40919789 (opens new window)

    http://python.usyiyi.cn/django/topics/class-based-views/index.html (opens new window)

    http://blog.csdn.net/hackerain/article/details/40919789 (opens new window)

    #Django#Django-Classview
    上次更新: 2023/03/28, 16:27:19
    Django 三个异步使用的案例
    django 相关命令总结

    ← Django 三个异步使用的案例 django 相关命令总结→

    最近更新
    01
    chromebox/chromebook 刷bios步骤
    03-01
    02
    redis 集群介绍
    11-28
    03
    go语法题二
    10-09
    更多文章>
    Theme by Vdoing | Copyright © 2015-2024 DeanWu | 遵循CC 4.0 BY-SA版权协议
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式