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来定义排序,其实类似的使用方式还有很多,这还需要根据需求来写自己的内容了

最新文章

  1. unity3d关于碰撞问题
  2. iOS widget开发
  3. 如何写出优雅的Python(二)
  4. ABP入门系列(3)——领域层创建实体
  5. PHP任意文件包含绕过截断新姿势
  6. express3.0安装并使用layout模板
  7. join用法
  8. 二模 (12) day1
  9. NLP相关资源
  10. 数学(GCD,计数原理)HDU 5656 CA Loves GCD
  11. 基于Sql Server 2008的分布式数据库的实践(三)
  12. Python学习最佳路线图
  13. java 获取微信公众号code为空
  14. CSS有哪些属性是可以继承的?
  15. Lodop获取全部JS代码,传统JS模版的生成
  16. mysqlbinlog相关
  17. Junit的Assert用法
  18. 【ASP.NET】System.Web.Routing - StopRoutingHandler Class
  19. Cross Validation(交叉验证)
  20. django admin编辑被外键关联的主表时支持显示字表记录

热门文章

  1. js 实现链表
  2. GCD中的线程死锁问题
  3. cocos2dx 修改亮度、对比度、色调、饱和度
  4. MySQL - Mac下安装MySQL
  5. 【MySQL】使用SQL语句操作MySQL
  6. Windows的cmd命令查询指定端口占用的进程并关闭
  7. linux redis5.0 集群搭建
  8. 使用JDBC操作数据库
  9. 小程序里面使用wxParse解析富文本导致页面空白等
  10. php扩展开发-MINFO