01-介绍

通用视图把视图开发中常用的写法和模式抽象出来,让你编写少量代码就能快速实现常见的数据视图。显示对象列表就是这样一种任务。

  1. Django 自带的通用视图能实现下述功能:
  2. 1、列出对象并显示单个对象的详细信息。如果创建一个管理会议的应用程序,那么 TalkListView Reg-
  3. isteredUserListView 就是列表视图。某一个演讲的页面就是详细信息视图。
  4.  
  5. 2、呈现基于日期的对象,显示为年月日归档页面(带有详细信息),以及“最新”页面。
  6.  
  7. 3、让用户创建、更新和删除对象——需不需要授权都行。
  1. # models.py
  2. from django.db import models
  3. class Publisher(models.Model):
  4. name = models.CharField(max_length=30)
  5. address = models.CharField(max_length=50)
  6. city = models.CharField(max_length=60)
  7. state_province = models.CharField(max_length=30)
  8. country = models.CharField(max_length=50)
  9. website = models.URLField()
  10. class Meta:
  11. ordering = ["-name"]
  12. def __str__(self):
  13. return self.name
  14. class Author(models.Model):
  15. salutation = models.CharField(max_length=10)
  16. name = models.CharField(max_length=200)
  17. email = models.EmailField()
  18. headshot = models.ImageField(upload_to='author_headshots')
  19.  
  20. def __str__(self):
  21. return self.name
  22.  
  23. class Book(models.Model):
  24. title = models.CharField(max_length=100)
  25. authors = models.ManyToManyField('Author')
  26. publisher = models.ForeignKey(Publisher)
  27. publication_date = models.DateField()

02-对象的通用视图-ListView

  1. # views.py
  2. from django.views.generic import ListView
  3. from books.models import Publisher
  4. class PublisherList(ListView):
  5. model = Publisher
  6. # 指定对应的模板
  7. template_name = books/ publisher_list.html
  8.  
  9. # urls.py
  10. from django.conf.urls import url
  11. from books.views import PublisherList
  12. urlpatterns = [
  13. url(r'^publishers/$', PublisherList.as_view()),
  14. ]
  1. # 渲染这个模板时,上下文中有个名为 object_list 的变量,它的值是所有出版社对象。
  2. {% extends "base.html" %}
  3. {% block content %}
  4. <h2>Publishers</h2>
  5. <ul>
  6. {% for publisher in object_list %}
  7. <li>{{ publisher.name }}</li>
  8. {% endfor %}
  9. </ul>
  10. {% endblock %}

03-指定模板上下文的名称 - context_object_name

  1. # 默认的为 object_name
  2.  
  3. class PublisherList(ListView):
  4. model = Publisher
  5. context_object_name = 'my_favorite_publishers'

04-提供额外的上下文变量 - get_context_data

通常,除了通用视图提供的信息之外,还想显示一些额外信息。但是如何在模板中获取额外的信息呢?

答案是扩展 ListView、DetailView等,自己实现 get_context_data 方法。

默认的实现只为模板提供该显示的对象,不过可 以覆盖,提供更多信息:

  1. from django.views.generic import DetailView
  2. from books.models import Publisher, Book
  3. class PublisherDetail(DetailView):
  4. model = Publisher
  5.  
  6. def get_context_data(self, **kwargs):
  7. # 先调用原来的实现,获取上下文
  8. context = super(PublisherDetail, self).get_context_data(**kwargs) # 把所有图书构成的查询集合添加到上下文中
  9. context['book_list'] = Book.objects.all()
  10. return context
  1. 提示:默认情况下,get_context_data 会把所有父类的上下文数据与当前类的合并在一起。如果在调 整上下文的子类中不想使用这种行为,要在超类上调用 get_context_data
  2. 如果两个类没有在 上下文中定义相同的键,这样得到的结果符合预期。
  3. 但是,如果尝试覆盖超类设定的键(在调 super 之后),当子类想覆盖所有超类时,子类也必须在调用 super 之后显式设定那个键。

05-显示对象的子集 - queryset

  1. from django.views.generic import DetailView
  2. from books.models import Publisher
  3.  
  4. class PublisherDetail(DetailView):
  5. context_object_name = 'publisher'
  6. # model = Publisher 其实是 queryset = Publisher.objects.all() 的简洁形式。
  7. # 然而,使用 queryset 可以过滤 对象列表,进一步指定要在视图中查看的对象。如:过滤等
  8. queryset = Publisher.objects.all()
  1. from django.views.generic import ListView
  2. from books.models import Book
  3.  
  4. class BookList(ListView):
  5. queryset = Book.objects.order_by('-publication_date')
  6. context_object_name = 'book_list'

06-动态过滤 - get_queryset()

  1. 需求:根据 URL 中指定的键过滤列表页面中的对象。
  2. 解决方法:覆盖 ListView get_queryset() 方法。它的默认实现是返回 queryset 属性的值,不过可以添加更多的逻辑。调用基于类的视图时,很多有用的东西存储到 self 中了,除了请 求(self.request)之外,还有根据 URL 配置捕获的位置参数(self.args)和关键字参数 (self.kwargs)。
  3.  
  4. # urls.py
  5. from django.conf.urls import url
  6. from books.views import PublisherBookList
  7. urlpatterns = [
  8. url(r'^books/([\w-]+)/$', PublisherBookList.as_view()),
  9. ]
  10.  
  11. # views.py
  12. from django.shortcuts import get_object_or_404
  13. from django.views.generic import ListView
  14. from books.models import Book, Publisher
  15. class PublisherBookList(ListView):
  16. template_name = 'books/books_by_publisher.html'
  17. def get_queryset(self):
  18. self.publisher = get_object_or_404(Publisher, name=self.args[0])
  19. return Book.objects.filter(publisher=self.publisher)

如果需要,可以使用 self.request.user 通过当前用户过 滤,或者实现其他更复杂的逻辑。与此同时,我们还可以把出版社对象添加到上下文中,供模板使用:

  1. def get_context_data(self, **kwargs):
  2. # 先调用原来的实现,获取上下文
  3. context = super(PublisherBookList, self).get_context_data(**kwargs)
  4. # 添加出版社对象
  5. context['publisher'] = self.publisher return context ## 执行额外的操作

07-在调用通用视图前后做些额外工作 - get_object()

假设 Author 模型中有个 last_accessed 字 段,用于记录这位作者的信息被人查看的最后时间:

  1. # models.py
  2. from django.db import models
  3.  
  4. class Author(models.Model):
  5. salutation = models.CharField(max_length=10)
  6. name = models.CharField(max_length=200)
  7. email = models.EmailField()
  8. headshot = models.ImageField(upload_to='author_headshots')
  9. last_accessed = models.DateTimeField()
  10.  
  11. # urls.py
  12. from django.conf.urls import url
  13. from books.views import AuthorDetailView
  14. urlpatterns = [
  15. #...
  16. url(r'^authors/(?P<pk>[0-9]+)/$', AuthorDetailView.as_view(),
  17. name='author-detail'),
  18. ]
  19.  
  20. # views.py
  21. from django.views.generic import DetailView
  22. from django.utils import timezone
  23. from books.models import Author
  24.  
  25. class AuthorDetailView(DetailView):
  26. queryset = Author.objects.all()
  27. def get_object(self):
  28. # 调用超类中的同名方法
  29. object = super(AuthorDetailView, self).get_object()
  30. # 记录最后访问日期 object.last_accessed = timezone.now() object.save()
  31. # 返回对象
  32. return object
  33.  
  34. # 注意:这里,URL 配置使用的分组名为 pk,这是 DetailView 过滤查询集合时查找主键所用的默认名称。
  35. # 如果把这个分组命名为其他值,要在视图中设定 pk_url_kwarg。详情参见 DetailView 的文档。

Django之通用视图的更多相关文章

  1. Django创建通用视图函数

    想在我们有两个视图: def thinkingview(request): user = request.user if request.method == 'GET': return render( ...

  2. Django入门-通用视图

    文档:https://docs.djangoproject.com/en/1.11/topics/class-based-views/ from django.shortcuts import get ...

  3. django 类通用视图详解

    view() :     该类为所有类视图的父类,处于最底层,仅仅只对请求参数做校验后,给特定请求方法做特定调用. 用法: url中定位到类方法:Aa.as_view() ——> View.as ...

  4. 5 第一个Django第4部分(表单和通用视图)

    上一节完成了视图编写,这一节为应用添加投票功能,也就是表单提交. 5.1编写一个简单的表单 5.2使用通用视图 5.3改良视图 5.1编写一个简单的表单 在网页设计中添加Form元素 polls/te ...

  5. Django 1.10中文文档-第一个应用Part4-表单和通用视图

    本教程接Part3开始.继续网页投票应用程序,并将重点介绍简单的表单处理和精简代码. 一个简单表单 更新一下在上一个教程中编写的投票详细页面的模板polls/detail.html,让它包含一个HTM ...

  6. 基于类的通用视图(Class-based generic views)

    在web开发中,最令人头痛的就是一遍又一遍的重复固定的模式.在解决了模板层面和模型层面的重复代码之痛之后,Django使用通用视图来解决视图层面的代码重复. 扩展通用视图 毫无疑问通用视图可以大幅度地 ...

  7. Django_通用视图(五)

    参考官网的投票系统,按照综合案例的流程创建应用polls,主要模块代码如下: test1/polls/models.py import datetime from django.db import m ...

  8. Django 1.6 基于类的通用视图

    Django 1.6 基于类的通用视图 最初 django 的视图都是用函数实现的,后来开发出一些通用视图函数,以取代某些常见的重复性代码.通用视图就像是一些封装好的处理器,使用它们的时候只须要给出特 ...

  9. django 创建一个通用视图

    创建一个通用视图   抽取出我们代码中共性的东西是一个很好的编程习惯. 比如,像以下的两个Python函数:     def say_hello(person_name): print 'Hello, ...

随机推荐

  1. Django的请求生命周期与中间件中的5中方法

    请求生命周期: 客户端——>WSGI——> 中间件——>路由匹配——>视图函数——>WSGI——>客户端 中间件: 在全局层明处理请求和响应的 form djang ...

  2. golang整数与小数间的加减乘除

    我们假设你需要 整数与小数一起进行运算,或者 整数除以整数 得到小数这种运算 如果你使用了decimal, 那么之后所有的运算你都必须使用decimal, 因为通过它计算出来的结果的类型统统为deci ...

  3. Spark的Shuffle

    0. Shuffle概述 要理解什么是Shuffle,首先介绍大数据与分布式.我们知道大数据的存储是分布式存储,大数据的计算框架是分布式的计算框架.分布式必然存在数据的交互传输,简言之Shuffle就 ...

  4. JavaScript 的基本使用

    JavaScript 基本语法要求: 1.JS的写法是严格区分大小写的. 2.标识符的起名要求跟java的是一样的,第一个位置可以说字母.下划线.美元符号.其他位置可以字母.下划线.美元符号.数字. ...

  5. 4.安装配置bacula-gui(管理页面)

    1.   安装配置bacula-gui(管理页面) Bacula-gui分为两个部分: Baculum-api可通过OAuth2(开放认证模式)或HTTP认证(用户名和密码)认证提供统一接口服务: B ...

  6. Python&Selenium借助html-testRunner生成自动化测试报告

    一.摘要 本博文将介绍Python和Selenium进行自动化测试时,借助html-testRunner 生成自动化测试报告 安装命令:pip install html-testRunner 二.测试 ...

  7. php 5.6 与 php 7 的区别

    1. PHP7.0 比PHP5.6性能提升了两倍. 2.PHP7.0全面一致支持64位. 3.PHP7.0之前出现的致命错误,都改成了抛出异常. 4.增加了空结合操作符(??).效果相当于三元运算符. ...

  8. Spring入门篇——第7章 Spring对AspectJ的支持

    第7章 Spring对AspectJ的支持 介绍Spring对AspectJ的支持 7-1 AspectJ介绍及Pointcut注解应用 实例 完成了在xml文件的配置 7-2 Advice定义及实例 ...

  9. 移动端性能监控方案Hertz

    移动端性能监控方案Hertz 吴凯 瑞利 富强 徐宏 ·2016-12-19 16:10 性能问题是造成App用户流失的罪魁祸首之一.App的性能问题包括崩溃.网络请求错误或超时.响应速度慢.列表滚动 ...

  10. mysql慢查询配置(5.7)

    刚装了Windows版mysql,想开启慢查询日志. 修改D:\mysql-5.7.23-winx64下my.ini配置文件,添加: [mysqld]slow_query_log = onslow_q ...