我们在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑、最终的目的都是一样的。 比如博客,通常其首页都是文章列表以及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基本就是大同小异
用类视图的方法可以简化代码,提高我们的开发效率
Django Python版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://www.yangyingqi.com/19.html