SingleObjectMixin

主要功能:

  1. def get_queryset(self):返回query_set里的所有对象

    • 如果提供的queryset为空且model不为空,返回self.model._default_manager.all()
    • 提供了queryset,返回self.queryset.all()
  2. get_object(self, queryset=None):根据请求url里的关键字参数pk或者slug过滤query_set来获取单一对象(obj)

    queryset = queryset.filter(pk=pk) 或者 queryset = queryset.filter(**{slug_field: slug})
    obj = queryset.get()
    return obj
    
  3. def get_context_data(self, **kwargs):将对象(obj)其插入到渲染模板所需的上下文中

    self.object = self.get_object
    context['object'] = self.object
    # 或者可以自定义对象名,两者是同时存在的:
    context[context_object_name] = self.object
    
class SingleObjectMixin(ContextMixin):"""提供了可以操纵检索单一对象的能力"""model = Nonequeryset = Noneslug_field = 'slug'context_object_name = Noneslug_url_kwarg = 'slug'pk_url_kwarg = 'pk'query_pk_and_slug = Falsedef get_object(self, queryset=None):# 根据pk和slug查找object# 如果自定义了queryset就使用它,这是子类需要的# 比如DateDetailViewif queryset is None:queryset = self.get_queryset()# 接着试着查询pkpk = self.kwargs.get(self.pk_url_kwarg)slug = self.kwargs.get(self.slug_url_kwarg)if pk is not None:queryset = queryset.filter(pk=pk)# 接着试着查询slugif slug is not None and (pk is None or self.query_pk_and_slug):slug_field = self.get_slug_field()queryset = queryset.filter(**{slug_field: slug})# If none of those are defined, it's an error.if pk is None and slug is None:raise AttributeError("Generic detail view %s must be called with either an object ""pk or a slug in the URLconf." % self.__class__.__name__)try:# Get the single item from the filtered querysetobj = queryset.get()except queryset.model.DoesNotExist:raise Http404(_("No %(verbose_name)s found matching the query") %{'verbose_name': queryset.model._meta.verbose_name})return objdef get_context_data(self, **kwargs):"""插入单一对象到上下文字典中"""context = {}if self.object:context['object'] = self.objectcontext_object_name = self.get_context_object_name(self.object)if context_object_name:context[context_object_name] = self.objectcontext.update(kwargs)return super().get_context_data(**context)

BaseDetailView

BaseDetailView主要是组合SingleObjectMixinview的各种方法来实现服务器处理一个获取单一对象的get请求的一般流程。

class BaseDetailView(SingleObjectMixin, View):"""一个展示单一对象的基本视图"""def get(self, request, *args, **kwargs):self.object = self.get_object()context = self.get_context_data(object=self.object)return self.render_to_response(context)

SingleObjectTemplateResponseMixin

SingleObjectTemplateResponseMixin主要是重写了get_template_names方法,也就是其模板的名字是

app_label + model_name(小写) + template_name_suffix(_detail)

class SingleObjectTemplateResponseMixin(TemplateResponseMixin):template_name_field = Nonetemplate_name_suffix = '_detail'def get_template_names(self):# 省略....if isinstance(self.object, models.Model):object_meta = self.object._metanames.append("%s/%s%s.html" % (object_meta.app_label,object_meta.model_name,self.template_name_suffix))elif getattr(self, 'model', None) is not None and issubclass(self.model, models.Model):names.append("%s/%s%s.html" % (self.model._meta.app_label,self.model._meta.model_name,self.template_name_suffix))return names

DetailView

class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView):"""Render a "detail" view of an object.By default this is a model instance looked up from `self.queryset`, but theview will support display of *any* object by overriding `self.get_object()`."""

总结

  1. SingleObjectMixin.get_context_data获取含有单个对象的上下文(context)

  2. SingleObjectTemplateResponseMixin.render_to_response利用上下文进行渲染并返回响应,并重写其

    get_template_names方法

  3. BaseDetailView组合SingleObjectMixin和View并实现get请求和分发

  4. DetailView组合SingleObjectTemplateResponseMixinBaseDetailView实现完整的逻辑处理

django通用视图的DetailView相关推荐

  1. django通用视图(CBV)

    1. 介绍 Django提供了很多通用的基于类的视图(Class Based View),来帮我们简化视图的编写.这些View与上述操作的对应关系如下: 展示对象列表(比如所有用户,所有文章)- Li ...

  2. Django通用视图ListView、DetailView、BaseListView使用方法

    DetailView django.views.generic.detail.DetailView 在执行此视图时,self.object将包含该视图所操作的对象. 该视图从以下视图继承方法和属性: ...

  3. django通用视图(视图类)的login登陆、权限限定

    django的登陆限定和权限限定是view设计中很重要的一个组成.网上的教程大部分都是通过使用view函数的装饰器来实现,比如: @login_required(login_url='/') @per ...

  4. Django通用显示视图DetailView与ListView

    基于类的通用视图 - 展平索引 通用显示视图 以下两个通用的基于类的视图旨在显示数据.在许多项目中,它们通常是最常用的视图. 一.DetailView django.views.generic.det ...

  5. django.views.generic通用视图的CreateView, ListView, UpdateView, DetailView, DeleteView用法

    导入: from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView 入坑指南 用 ...

  6. django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图

    基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...

  7. Python Django CBV下的通用视图函数

    ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request):retur ...

  8. Django 学习小组:基于类的通用视图详解(一)

    通过三周的时间我们开发了一个简单的个人 Blog,教程地址: 第一周:Django 学习小组:博客开发实战第一周教程 -- 编写博客的 Model 和首页面 第二周:Django 学习小组:博客开发实 ...

  9. Django 基于类的通用视图详解

    原文出处:https://segmentfault.com/a/1190000005685454 Django 学习小组:基于类的通用视图详解(一) 通过三周的时间我们开发了一个简单的个人 Blog, ...

最新文章

  1. android studio配置系列 - 收藏集 - 掘金
  2. android源码编译 简书,android学习笔记之源码编译
  3. iBatis整理——iBatis批处理实现(Spring环境)
  4. java按照io流向基类_Java IO详解
  5. 利用Packer自定义镜像创建容器集群
  6. 请说明Request和Session的生命周期
  7. java 关于日期的操作
  8. 连接MySQL时出现警告Establishing SSL connection without server's identity verification is not recommended.
  9. HTMl中3d变换卡片制作方法,CSS如何实现卡片3D翻转效果
  10. 将java类的泛型集合转换成json对象
  11. 电力电子转战数字IC20220610day21——杂七杂八
  12. 软考高级 真题 2011年上半年 信息系统项目管理师 综合知识
  13. 高校大学生可以免费领半年阿里云服务器
  14. 优化屏蔽广告.提高浏览体验
  15. 玩转NVIDIA Jetson AGX Xavier(3)--- 使用JetPack 4.1为Xavier刷机
  16. 橘子学java之java中的协程
  17. 微信小程序实现身份证识别功能
  18. 18个公认的 世界顶级UI开源框架汇总
  19. abp生成proxy代理时的一些问题记录
  20. 移动GPU渲染原理的流派——IMR、TBR及TBDR

热门文章

  1. 基于Paddlepaddle复现Yolov5,支持PaddleDetection接口
  2. LinkedIn领英开发客户方法大全(篇一)
  3. 什么是射频滤波器?它的起源背景是什么?-道合顺大数据Infinigo
  4. RocketMQ 大神丁威亲述参与开源社区的方式
  5. Xshell下利用tftp和iperf3进行网络吞吐量测试
  6. 2022-2-1 牛客 C++项目 —— 线程同步
  7. MP3文件结构解析(超详细)
  8. (springboot+小程序)心理疗愈 毕业设计源码论文+答辩PPT
  9. perl使用学习(全程更新)
  10. InnovEDA PowerPCB/BGA Suite 4.0.1 + InnovEDA Visual HDL V6.7.8 for Verlog