django通用视图的DetailView
SingleObjectMixin
主要功能:
def get_queryset(self):
返回query_set里的所有对象- 如果提供的
queryset
为空且model
不为空,返回self.model._default_manager.all()
- 提供了
queryset
,返回self.queryset.all()
- 如果提供的
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
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
主要是组合SingleObjectMixin
和view
的各种方法来实现服务器处理一个获取单一对象的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()`."""
总结
SingleObjectMixin.get_context_data
获取含有单个对象的上下文(context
)SingleObjectTemplateResponseMixin.render_to_response
利用上下文进行渲染并返回响应,并重写其get_template_names方法
BaseDetailView组合SingleObjectMixin和View
并实现get
请求和分发DetailView
组合SingleObjectTemplateResponseMixin
和BaseDetailView
实现完整的逻辑处理
django通用视图的DetailView相关推荐
- django通用视图(CBV)
1. 介绍 Django提供了很多通用的基于类的视图(Class Based View),来帮我们简化视图的编写.这些View与上述操作的对应关系如下: 展示对象列表(比如所有用户,所有文章)- Li ...
- Django通用视图ListView、DetailView、BaseListView使用方法
DetailView django.views.generic.detail.DetailView 在执行此视图时,self.object将包含该视图所操作的对象. 该视图从以下视图继承方法和属性: ...
- django通用视图(视图类)的login登陆、权限限定
django的登陆限定和权限限定是view设计中很重要的一个组成.网上的教程大部分都是通过使用view函数的装饰器来实现,比如: @login_required(login_url='/') @per ...
- Django通用显示视图DetailView与ListView
基于类的通用视图 - 展平索引 通用显示视图 以下两个通用的基于类的视图旨在显示数据.在许多项目中,它们通常是最常用的视图. 一.DetailView django.views.generic.det ...
- django.views.generic通用视图的CreateView, ListView, UpdateView, DetailView, DeleteView用法
导入: from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView 入坑指南 用 ...
- django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图
基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...
- Python Django CBV下的通用视图函数
ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request):retur ...
- Django 学习小组:基于类的通用视图详解(一)
通过三周的时间我们开发了一个简单的个人 Blog,教程地址: 第一周:Django 学习小组:博客开发实战第一周教程 -- 编写博客的 Model 和首页面 第二周:Django 学习小组:博客开发实 ...
- Django 基于类的通用视图详解
原文出处:https://segmentfault.com/a/1190000005685454 Django 学习小组:基于类的通用视图详解(一) 通过三周的时间我们开发了一个简单的个人 Blog, ...
最新文章
- android studio配置系列 - 收藏集 - 掘金
- android源码编译 简书,android学习笔记之源码编译
- iBatis整理——iBatis批处理实现(Spring环境)
- java按照io流向基类_Java IO详解
- 利用Packer自定义镜像创建容器集群
- 请说明Request和Session的生命周期
- java 关于日期的操作
- 连接MySQL时出现警告Establishing SSL connection without server's identity verification is not recommended.
- HTMl中3d变换卡片制作方法,CSS如何实现卡片3D翻转效果
- 将java类的泛型集合转换成json对象
- 电力电子转战数字IC20220610day21——杂七杂八
- 软考高级 真题 2011年上半年 信息系统项目管理师 综合知识
- 高校大学生可以免费领半年阿里云服务器
- 优化屏蔽广告.提高浏览体验
- 玩转NVIDIA Jetson AGX Xavier(3)--- 使用JetPack 4.1为Xavier刷机
- 橘子学java之java中的协程
- 微信小程序实现身份证识别功能
- 18个公认的 世界顶级UI开源框架汇总
- abp生成proxy代理时的一些问题记录
- 移动GPU渲染原理的流派——IMR、TBR及TBDR
热门文章
- 基于Paddlepaddle复现Yolov5,支持PaddleDetection接口
- LinkedIn领英开发客户方法大全(篇一)
- 什么是射频滤波器?它的起源背景是什么?-道合顺大数据Infinigo
- RocketMQ 大神丁威亲述参与开源社区的方式
- Xshell下利用tftp和iperf3进行网络吞吐量测试
- 2022-2-1 牛客 C++项目 —— 线程同步
- MP3文件结构解析(超详细)
- (springboot+小程序)心理疗愈 毕业设计源码论文+答辩PPT
- perl使用学习(全程更新)
- InnovEDA PowerPCB/BGA Suite 4.0.1 + InnovEDA Visual HDL V6.7.8 for Verlog