django支持类视图,与此同时django为我们提供了许多非常好用的通用视图供我们使用,这其中TemplateView、ListView和DetailView是我们经常使用到的,这里就对TemplateView和ListView做一个简单的介绍

TemplateView:模板视图
在Django项目中,我们经常会使用到静态页面,也就是这个页面内的内容是写死的,不需要其他数据的渲染,完成这个任务的时候TemplateView就是一个非常好的选择,例如我们做一个网站肯定需要写一个‘关于本网站’的页面,这时候我们只需要将这个页面的HTML文件写在django项目的templates文件夹之中,然后在url映射时在as_view()中传递template_name参数把写好的模板名称传递进去就好,示例代码如下:

'about.html'中代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
  <h2>这是网站详情</h2>
</body>
</html>

'url.py'中代码
from django.views.generic import TemplateView
path('about/', TemplateView.as_view(template_name='about.html'), name='about')

其实在使用TemplateView时,我们也可以为它传递数据,这时候我们就可以编写自己的试图类,让它继承TemplateView,我们在定义一个template_name的静态字段来指定模板,同时我们需要定义一个get_context_data的类方法,来向模板传递数据(其实在模板中发送ajax请求也可以用来请求数据)。示例代码如下:
'about.html'中代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
  <h2>这是网站详情</h2>
  <h2>{{ phone }}</h2>
</body>
</html>

'url.py'中代码:
path('about/', AboutView.as_view(), name='about')

'views.py'中代码:
from django.views.generic import TemplateView

class AboutView(TemplateView):
  template_name = 'about.html'

  def get_context_data(self):
    context = Super(AboutView, self).get_context_data()
    context['phone'] = '021-8888888'
    return context

ListView:列表视图
在网站开发中,经常会出现需要列出某个表中的一些数据作为列表展示出来。比如文章列表,图书列表等等。在Django中可以使用ListView来帮我们快速实现这种需求。示例代码如下:

class ArticleListView(ListView):
  # 定义要展示的数据模型
  model = Article
  # 定义要展示在哪个模板上
  template_name = 'article_list.html'
  # 定义每页要显示多少条数据
  paginate_by = 10
  # 定义这个列表集合在模板文件中的名称
  context_object_name = 'articles'
  # 定义排序规则
  ordering = 'create_time'
  # 定义分页的关键字,默认为'page'
  page_kwarg = 'page'

  # 自定义上下文内容,默认只显示模型中内容,在重写此方法时必须要重写父类的此方法
  def get_context_data(self, **kwargs):
    context = super(ArticleListView, self).get_context_data(**kwargs)
    print(context)
    return context

  # 默认显示模型的所有数据,若定义了,则显示返回的集合
  def get_queryset(self):
    return Article.objects.filter(id__lte=89)

对以上代码进行解释:
首先ArticleListView是继承自ListView。
model:重写model类属性,指定这个列表是给哪个模型的。
template_name:指定这个列表的模板。
paginate_by:指定这个列表一页中展示多少条数据。
context_object_name:指定这个列表模型在模板中的参数名称。
ordering:指定这个列表的排序方式。
page_kwarg:获取第几页的数据的参数名称。默认是page。
get_context_data:获取上下文的数据。
get_queryset:如果你提取数据的时候,并不是要把所有数据都返回,那么你可以重写这个方法。将一些不需要展示的数据给过滤掉。

注意,其实和其他类视图一样,当http请求的时候,会先执行本身的dispatch方法,然后根据dispatch和请求方法的不同执行对应的方法,在使用ListView时一般会执行get方法。这样有些时候,我门就可以重写get方法来定义我们在get_queryset和get_context_data所能使用到的变量,例如需要按照某种方式排序,这时候需要先拿到这个排序关键词的值,显然拿到关键词的步骤可以写在get方法之中,然后根据排序值在get_queryset和get_context_data中使用已达到排序。

def get(self, request, *args, **kwargs):

  self._sort = self.request.GET.get('sort')

  return super(ArticleListView, self).get(request, *args, **kwargs)

这时候在写get_queryset的时候就可以使用self._sort来定义排序,其实类似的使用方式还有很多,这还需要根据需求来写自己的内容了

django通用视图之TemplateView和ListView简单介绍的更多相关文章

  1. Django通用视图APIView和视图集ViewSet的介绍和使用

    原 Django通用视图APIView和视图集ViewSet的介绍和使用 2018年10月21日 14:42:14 不睡觉假扮古尔丹 阅读数:630   1.APIView DRF框架的视图的基类是 ...

  2. Django通用视图执行过程

    使用通用视图后,Django请求处理过程(以ListView为例):在我们自定义的视图中: class IndexView(ListView): template_name = 'blog/index ...

  3. django通用视图

    通用视图 1. 前言 回想一下,在Django中view层起到的作用是相当于controller的角色,在view中实施的 动作,一般是取得请求参数,再从model中得到数据,再通过数据创建模板,返回 ...

  4. 6:django 通用视图

    上一节我们介绍了django视图函数里面几个常用的函数,这节我们来看一下django为我们提供的一些通用视图吧 在最后面有我自己的示例代码,html部分太多了就不贴了 “简单”视图函数 正如名字所言, ...

  5. django通用视图(类方法)

    这周是我入职的第一周,入职第一天看到嘉兴大佬的项目代码.视图中有类方法,我感到很困惑. 联想到之前北京融360的电话面试,问我有无写过类方法……看来有必要了解下视图的类方法,上网搜了很多,原来这就是所 ...

  6. Django通用视图APIView和视图集ViewSet的介绍和使用(Django编程-1)

    1.APIView DRF框架的视图的基类是 APIView APIView的基本使用和View类似 Django默认的View请求对象是 HttpRequest,REST framework 的请求 ...

  7. Django - 通用视图

    urls.py from . import views ... url(r'^$', views.IndexView.as_view, name="index"), url(r'^ ...

  8. Django 基于类的通用视图

    在早期,我们认识到在视图开发过程中有共同的用法和模式.这时我们引入基于函数的通用视图来抽象这些模式以简化常见情形的视图开发. 基于函数视图的用法有以下三种: def index(request): r ...

  9. Django:之Sitemap站点地图、通用视图和上下文渲染器

    Django中自带了sitemap框架,用来生成xml文件 Django sitemap演示: sitemap很重要,可以用来通知搜索引擎页面的地址,页面的重要性,帮助站点得到比较好的收录. 开启si ...

随机推荐

  1. 线程 task 使用三种方法

    1:用TaskFactory的实例: 运行结果为: 2. 使用task类的Factory属性 3.使用task类的实例,用start来启动任务.  当我们用Task类时,除了用start方法,也可以用 ...

  2. vue-wechat-title

    html中的title安装:npm install vue-wechat-title --save1.在mian.js中//网页titleimport VueTitle from 'vue-wecha ...

  3. 3、SpringBoot+Mybatis整合------主键回填

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis01/tree/d68efe51774fc4d96e5c6870 ...

  4. px与em的区别,权重的优先级

    px与em的区别,权重的优先级 PX特点:px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.EM特点:1. em的值并不是固定的:2. em会继承父级元素的字体大小. 权重 ...

  5. LInux操作随手笔记

    一.find 的用法 实例 find / -name test.txt 就可以找到这个文件的路径(如果存在). 二.学用vi编辑器,学用rz往linux服务器上面上传文件 linux中rz 和 sz ...

  6. SQL-批量插入和批量更新

    批量插入 表结构一样或类似 如果两张表的结构一样,例如一个表的结构和另一个表的结构一样,只是其中一张是临时表,而另一张表是存储数据的表,我们需要进行一次表的迁移的话,我们可以这样. insert in ...

  7. pytorch中词向量生成的原理

    pytorch中的词向量的使用 在pytorch我们使用nn.embedding进行词嵌入的工作. 具体用法就是: import torch word_to_ix={'hello':0,'world' ...

  8. 笔记-python-functool-@wraps

    笔记-python-functool-@wraps 1.      wraps 经常看到@wraps装饰器,查阅文档学习一下 在了解它之前,先了解一下partial和updata_wrapper这两个 ...

  9. linux c 调用子文件函数

    今天在学习初级linux c的时候遇到了如下问题:通过主函数调用同路径下的子文件函数调用失败.博主是这样一一解决的: 首先:hello.c: hello.c: #include<bool.c&g ...

  10. spark的排序方法

    今天我们来介绍spark中排序的操作,spark的排序很简单,我们可以直接使用sortBy来进行,这个里面我们使用case clas,使用case class的好处是1.不用newjiukeyi 搞出 ...