generic views reference文档详细 介绍了通用视图以及它的选项;本篇文档剩余的部分将会介绍自定义以及扩展通用 视图的常见方法。...在一个通用视图上的context_object_name属性指定了要使用的定了上下文变量: # views.py from django.views.generic import ListView from...DetailView通用视图提供了一个publisher对象给context,但是我们如何在模板中添加附加信息呢?...然而,如果任何一个类尝试在超类持有一个键的情况下覆写它(在调用超类之后),这个类的任何子类都需要显式于超类之后设置它,如果你想要确保他们覆写了所有超类的话。...相当方便的是, ListView 有一个get_queryset() 方法来供我们重写。在之前,它只是返回一个queryset属性值,但是现在我们可以添加更多的逻辑。
于是,Django 把这些相同的逻辑代码抽取了出来,写成了一系列的通用视图函数,即基于类的通用视图(Class Based View)。...使用类视图是 Django 推荐的做法,而且熟悉了类视图的使用方法后,能够减少视图函数的重复代码,节省开发时间。接下来就让我们把博客应用中的视图函数改成基于类的通用视图。...将 index 视图函数改写为类视图 针对这种从数据库中获取某个模型列表数据(比如这里的 Post 列表)的视图,Django 专门提供了一个 ListView 类视图。...比如 url(r'^$', views.index, name='index'),它的第一个参数是 URL 模式,第二个参数是视图函数 index。...首先我们为 PostDetailView 类指定了一些属性的值,这些属性的含义和 ListView 中是一样的,这里不再重复讲解。 紧接着我们覆写了 get 方法。
于是,django 把这些相同的逻辑代码抽取了出来,写成了一系列的通用视图函数,即基于类的通用视图(Generic Class Based View)。...使用类视图是 django 推荐的做法,熟悉了类视图的使用方法后,能够减少视图函数的重复代码,节省开发时间。接下来就让我们把博客应用中的视图函数改成基于类的通用视图。...将 index 视图函数改写为类视图 针对这种从数据库中获取某个模型列表数据(比如这里的 Post 列表)的视图,Django 专门提供了一个 ListView 类视图。...比如 path('', views.index, name='index'),它的第一个参数是 URL 模式,第二个参数是视图函数 index。对 url 函数来说,第二个参数传入的值必须是一个函数。...首先我们为 PostDetailView 类指定了一些属性的值,这些属性的含义和 ListView 中是一样的,这里不再重复讲解。 紧接着我们覆写了 get 方法。
如上面代码所示, 当我们把视图绑定到 url conf 时使用的 as_view 挂载其实返回的是一个函数....这样就太像基于函数的视图了, 当然view_function其实就是函数. as_view 方法是基于类的外部接口, 他返回一个视图函数....调用后, 视图将请求传递给dispatch() 方法,该方法将根据请求的类型(GET, POST, PUT, etc)执行响应的方法(详情参考django/views/generic/base.py,...如果方法为 GET 则执行 get() 方法, 如果为 POST 则执行 post() ; views.py Python from django.views import View class ContactView...通用视图的实现, 使用大量的 mixins. 这一点, 仁者见仁智者见智. 可以查看基于类的通用视图-扁平索引 , 来查看所有的视图的方法. 它非常实用,建议把 这个页面放到浏览器书签栏里.
Django源码学习-8-ListView 通用视图-续 ?...django基于类的通用视图就是将一些mixin合成为有用的通用视图。...基于类的通用视图(以及任何继承了Django提供的基础类的基于类的视图)都能够以下面两种方式被配置:子类化,或者直接通过URLconf来传递参数。...当子类化一个类视图时,可以重写一些属性(比如template_name)或者 一些方法(比如 get_context_data)在子类中来提供一些新的值或者方 法。...Django有一个通用视图来完成这个功能 - TemplateView - 因此可以子类化它,然后重写模板的名称: from django.views.generic import TemplateView
Django源码学习-8-ListView&DetailView通用视图 ?...请求网站页面是get请求,提交表单为post请求,可通过继承View类来自动识别请求,如果为get,自动调用get方法,为post就自动调用POST方法。 ?...ListView的自定义,还可以通过重写get_context_data方法传递额外的参数或内容。...:默认为 '_list' allow_empty 默认为 True (False 表示 object_list 为 空时,显示 404) get_context_data() 可以添加额外的模板 context..., 默认将 model / queryset 指定的 objects 添加到模板 context get_queryset() 默认返回属性 queryset from django.views.generic
基于类的视图简介 内建的基于类的通用视图 使用基于类的视图处理表单 使用混合来扩展视图类 基本的示例 Django 提供基本的视图类,它们适用于广泛的应用。...所有的视图类继承自View类,它负责连接视图到URL、HTTP 方法调度和其它简单的功能。RedirectView用于简单的HTTP 重定向,TemplateView扩展基类来渲染模板。...子类化通用视图 第二种,功能更强一点的使用通用视图的方式是继承一个已经存在的视图并在子类中覆盖其属性(例如template_name)或方法(例如get_context_data)以提供新的值或方法。...Django 有一个通用视图TemplateView来做这件事,所以我们可以简单地子类化它,并覆盖模板的名称: # some_app/views.py from django.views.generic...TemplateView是一个类不是一个函数,所以我们将URL 指向类的as_view()方法,它让基于类的视图提供一个类似函数的入口: # urls.py from django.conf.urls
Django为你提供了一个简单的方法来避免这个困扰,那就是在form表单内添加一条{% csrf_token %}标签,标签名不可更改,固定格式,位置任意,只要是在form表单内。...将下面的代码添加到polls/views.py: # polls/views.py from django.shortcuts import get_object_or_404, render from...由于这个过程是如此的常见,Django又很善解人意的帮你想办法偷懒了,它提供了一种快捷方式,名为generic views系统。...这里使用两个通用视图:ListView和DetailView。这两个视图分别代表“显示对象列表”和“显示特定类型对象的详细信息页面”的抽象概念。 每个通用视图需要知道它将作用于哪个模型。...现在你可以运行开发服务器,然后试试基于泛型视图的应用程序了。 更多关于通用视图的详细信息,请查看通用视图文档。
方法: get_queryset():返回用来获取本视图显示对象的queryset.如果设置了queryset属性,get_queryset()默认返回它的值. get_object(queryset=...get_context_data(**kwargs):返回显示对象的上下文数据.这个方法的基本实现需要object属性被视图赋值(即使是None).它返回一个包含这些内容的字典: object:这个视图显示的对象...,并重定向到get_success_url(),可以覆盖该方法在以上行为之间添加额外的动作.该方法必须返回一个HttpResponse. form_invalid(form):如果表单验证失败,则使用已填充的表单数据和错误信息重新渲染上下文...显示确认页面并删除现有对象的视图.仅当请求方法为POST时,才会删除给定的内容.如果此视图是通过GET提取的,它将显示一个确认页面,其中包含POST到同一网址的表单....可以直接用Django通用视图里的UpdateView和CreateView。
在 polls/views.py 中添加如下代码: from django.shortcuts import get_object_or_404, render from django.http import...请注意 Django 也同样的提供了通过 request.GET 获取 GET 数据的方法 – 但是在代码中我们明确的使用了 request.POST 方法,以确保数据是通过 POST 方法来修改的。...它指定了我们想要的跳转的视图函数名以及视图函数中 URL 模式相应的可变参数。...由于这类现象很 常见,因此 Django 提供了一种快捷方式,被称之为“通用视图”系统。 通用视图抽象了常见的模式,以至于你不需要编写 Python 代码来编写一个应用。...同样的,~django.views.generic.list.ListView 通用视图使用的默认模板名为 /_list.html ;我们指定了 template_name 参数告诉
Django 内置的 Pagination 能够帮助我们实现简单的分页功能。 Paginator 类的常用方法 分页功能由 Django 内置的 Paginator 类提供。...这个类位于 django/core/paginator.py,需要使用它时,只需在适当的地方导入这个类即可。下面的代码摘自 Django 的官方文档中 Pagination 的示例。...: That page contains no results 更多方法和属性请参阅 Django Pagination 的官方文档。...不过在我们的博客项目中,我们不必写这些代码了。回顾在 基于类的通用视图:ListView 和 DetailView 中的内容,我们已将视图函数转换成了类视图。...而类视图 ListView 已经帮我们写好了上述的分页逻辑,我们只需通过指定 paginate_by 属性来开启分页功能即可,即在类视图中指定 paginate_by 属性的值: blog/views.py
但想实现下面这样的一个比较完善的分页导航时,Django Pagination 内置的 API 已经无法满足需求。...于是 Django 把这些相同的逻辑代码抽取了出来,写成了一系列的通用视图函数,即基于类的通用视图。本文将使用到通用视图 ListView。...ListView 用来从数据库获取一个对象列表,而对列表进行分页的过程也是比较通用的,ListView 已经实现了分页功能。...第二个参数是被调用的视图函数,其类型必须是一个函数。而我们写的 IndexView 视图是一个类,为了将其转换成一个函数,只需要调用其父类中的 as_view 方法即可。...在类视图中,这个需要传递的模板变量字典是通过 get_context_data 获得的, 所以我们复写该方法,以便我们能够自己再插入一些我们自定义的模板变量进去。
我们可以把这些操作逻辑写在一个直观的 Python 函数里,但是 Django 开发者们意识到很多视图函数中的逻辑代码都是重复和通用的,因此在较早的版本中,Django 便开始引入 Class-based...类视图比函数视图提供了更加高层的抽象,它将上边提及的数据库操作、表单处理、模板渲染等通用操作抽取为类视图中的方法,函数的参数、状态等则抽取为类视图的属性,最终通过一个 as_view 方法将整个类视图转换为一个可调用对象...即使是通读过官方文档的类视图部分,新手在使用过程中依然感到有一定障碍,无法灵活运用各种内置的类通用视图,以及在必要时通过继承的方式拓展类视图(至少对我来说,刚接触类视图时就是这种状态)。...举一个例子,ListView 主要用于从数据库中获取多条记录,它的继承关系如下: ContextMixin --> MultipleObjectMixin + |...总结 我们从一个很高的层面概览了 Django 类视图的源码结构和类继承体系,建立这样一个宏观的源码结构地图有助于接下来对源码细节的深入探索。
注意这里我们使用的是类视图,类视图的内容具体请参考 基于类的通用视图:ListView 和 DetailView。...同时我们还给该方法提供了一个 extensions 的额外参数。...在渲染 Markdown 文本时加入了 toc 拓展后,就可以在文中插入目录了。方法是在书写 Markdown 文本时,在你想生成目录的地方插入 [TOC] 标记即可。...类 md,和 markdown.markdown() 方法一样,也传入了 extensions 参数。...Markdown 内置的处理方法不能处理中文标题,所以我们使用了 django.utils.text 中的 slugify 方法,该方法可以很好地处理中文。
上一节的注册中,使用了 form 表单,在 标签中,定义了 method 属性告诉浏览器想如何与服务器通信。...HTTP 规范定义了几种 request methods 请求方法,需要使用 GET 和 POST。...GET 用于从服务器请求数据,每当点击了一个链接或者直接在浏览器中输入一个网址时,就创建了一个 GET 请求。 POST 用于想更改服务器上的数据,每次发送数据给服务器都会导致资源状态变化。...应用程序每次接收一个 POST 时,都先检查 CSRF Token,如果这个 request 没有 token,或者这个 token 是无效的,它就会抛弃提交的数据。...基于类的通用视图 from django.views.generic import UpdateView, ListView ① 主页 class BoardListView(ListView):
类视图类视图是一种更高级别的视图函数类型,它使用基于类的方法来处理HTTP请求。类视图通常比函数视图更灵活和可扩展,并提供更好的代码组织和可重用性。...Django提供了许多内置的类视图,如DetailView和ListView,可以用于快速创建常见的Web应用程序功能。...(TemplateView): template_name = 'hello.html'在这个示例中,我们定义了一个名为HelloView的类视图,它继承自Django的TemplateView类...Django REST框架是一种流行的用于构建Web API的Django扩展,它提供了许多内置的API视图类和工具。...视图函数装饰器Django提供了许多有用的视图函数装饰器,它们可以用于修改视图函数的行为或添加额外的功能。
在本讲中,我们开始首页功能的开发,在开发过程中,大家将会学习到Django中的通用视图类、分页对象paginator以及foreignKey外键的使用。 效果演示 [16851ab0d057a5d6?...显示列表数据非常简单,我们使用django中内置的视图模版类ListView来显示,首先在view.py中编写IndexView类,用它来显示列表数据。...context_object_name = 'video_list' 此处,我们使用了django提供的通用视图类ListView, ListView使用很简单,只需要我们简单的配置几行代码,即可将数据库里面的数据渲染到前端...显示结果如下 [首页展示] 分类功能 在写分类功能之前,我们先学习一个回调函数 get_context_data() 这是ListView视图类中的一个函数,在 get_context_data() 函数中...c={{ item.id }} 这里用c代表分类的id,点击后,会传到视图类中,在视图类中,我们使用 get_queryset() 函数,将get数据取出来。
类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图。使用类视图可以使用类的一些特性,比如继承等。...1.1 View django.views.generic.base.View是主要的类视图,所有的类视图都是继承自他。如果我们写自己的类视图,也可以继承自他。...然后再根据当前请求的method,来实现不同的方法。比如这个视图只能使用get的方式来请求,那么就可以在这个类中定义get(self,request,*args,**kwargs)方法。...比如你的类视图只支持get方法,而出现了post方法,那么就会把这个请求转发给http_method_not_allowed(request,*args,**kwargs)。...在Django中可以使用ListView来帮我们快速实现这种需求。
_01(),None,None)), ] 为什么要将get_urls_02的方法写入到ModelMyAdmin类中,而不写在MyAdminSite类中?...urls方法: from django.conf.urls import url def get_urls_01(self): res = []...文件中的ModelMyAdmin类中继续添加一个urls方法: from django.shortcuts import render def listview(self...此问题的原因是:在没有自定制配置类的模型表就继承了默认配置表类,默认配置类中的list_display是空列表。..._meta.get_field(field_or_func)时没有此字段就会报错 解决问题的方法是:异常处理 for field_or_func in self.list_display