Django中类视图ListView和DetailView的使用


2020年4月2日 22:40 阅读 821 评论 0 Django

我们在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑、最终的目的都是一样的。 比如博客,通常其首页都是文章列表以及siderbar里的文章分类、推荐阅读、标签等等。 对处理首页的视图函数来说,是从数据库取出文章进行分页再返还给前端显示。这样一来代码就会有很多冗余,并且可读性也不是很高。

不过幸好,Django帮我们把这些相同的逻辑代码抽取了出来,写成了一系列的通用视图函数,即基于类的通用视图(Class Based View)。

使用类视图是 Django 推荐的做法,而且熟悉了类视图的使用方法后,能够大幅度减少视图函数的重复代码,节省开发时间。接下来我就大概说一下类视图中ListView和DetailView的使用方法

  • ListView

通常我们会在博客首页的视图函数里这样写

from .models import Article # 引入博文类 

def index(request): 

    # 从数据库中取出博文并按发表时间倒序排列 
    posts = Article.objects.all().order_by('-created_time') 
    paginator = Paginator(_posts, 5) # 每页五篇博文 
    posts = paginator.page(1) #取出第一页交给模板渲染 
    return render(request, 'index.html', context={'posts':posts}) 

然后前端中一个for循环就完了

我们再来看看类视图中ListView是怎样做的,对比一下

from .models import Article # 引入博文类 
from django.views import generic # 引入通用视图类 

class IndexView(generic.ListView): # 继承ListView 
    model = Article # 你要查询的模型名 
    template_name = 'index.html' # 要渲染的模板 
    context_object_name = 'posts' # 与上面context中的posts对应 
    paginate_by = 5 # 每页五篇博文 

两个对比之后,很明显第二个ListView更加简明一点,我们ajax加载下一页时甚至可以直接继承IndexView类,获取下一页

  • DetailView

除了从数据库中取出模型列表的数据外,从数据库取出模型的一条记录数据也是常见的需求。比如获取某篇文章的详情,就是从数据库中取出这篇文章的记录然后渲染模板。 对于这种类型的需求,Django 提供了一个 DetailView 类。下面我们也用对比的方式来看

一般写法

from .models import Article # 引入博文类 

def get_article_detail(request,article_id): 
    article = Article.objects.get(id=article_id) 
    return render(request, 'detail.html', context={'article':article}) 

DetailCView的写法

from django.views import generic 

class PostDetailView(generic.DetailView): 
    # 这些属性的含义和 ListView 是一样的 
    model = Article 
    template_name = 'detail.html' 
    context_object_name = 'article' 

可以看到,DetailView和ListView基本就是大同小异

用类视图的方法可以简化代码,提高我们的开发效率

最后修改于2020年4月2日 22:40
©允许规范转载

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.yyqblog.com/article/19.html

微信
支付宝
提交数据中...