11import markdown
22
33from django .shortcuts import render , get_object_or_404
4+ from django .views .generic import ListView , DetailView
45from comments .forms import CommentForm
56from .models import Post , Category
67
@@ -25,6 +26,12 @@ def index(request):
2526 return render (request , 'blog/index.html' , context = {'post_list' : post_list })
2627
2728
29+ class IndexView (ListView ):
30+ model = Post
31+ template_name = 'blog/index.html'
32+ context_object_name = 'post_list'
33+
34+
2835"""
2936请使用下方包含评论列表和评论表单的详情页视图
3037def detail(request, pk):
@@ -64,14 +71,82 @@ def detail(request, pk):
6471 return render (request , 'blog/detail.html' , context = context )
6572
6673
74+ # 记得在顶部导入 DetailView
75+ class PostDetailView (DetailView ):
76+ # 这些属性的含义和 ListView 是一样的
77+ model = Post
78+ template_name = 'blog/detail.html'
79+ context_object_name = 'post'
80+
81+ def get (self , request , * args , ** kwargs ):
82+ # 覆写 get 方法的目的是因为每当文章被访问一次,就得将文章阅读量 +1
83+ # get 方法返回的是一个 HttpResponse 实例
84+ # 之所以需要先调用父类的 get 方法,是因为只有当 get 方法被调用后,
85+ # 才有 self.object 属性,其值为 Post 模型实例,即被访问的文章 post
86+ response = super (PostDetailView , self ).get (request , * args , ** kwargs )
87+
88+ # 将文章阅读量 +1
89+ # 注意 self.object 的值就是被访问的文章 post
90+ self .object .increase_views ()
91+
92+ # 视图必须返回一个 HttpResponse 对象
93+ return response
94+
95+ def get_object (self , queryset = None ):
96+ # 覆写 get_object 方法的目的是因为需要对 post 的 body 值进行渲染
97+ post = super (PostDetailView , self ).get_object (queryset = None )
98+ post .body = markdown .markdown (post .body ,
99+ extensions = [
100+ 'markdown.extensions.extra' ,
101+ 'markdown.extensions.codehilite' ,
102+ 'markdown.extensions.toc' ,
103+ ])
104+ return post
105+
106+ def get_context_data (self , ** kwargs ):
107+ # 覆写 get_context_data 的目的是因为除了将 post 传递给模板外(DetailView 已经帮我们完成),
108+ # 还要把评论表单、post 下的评论列表传递给模板。
109+ context = super (PostDetailView , self ).get_context_data (** kwargs )
110+ form = CommentForm ()
111+ comment_list = self .object .comment_set .all ()
112+ context .update ({
113+ 'form' : form ,
114+ 'comment_list' : comment_list
115+ })
116+ return context
117+
118+
67119def archives (request , year , month ):
68120 post_list = Post .objects .filter (created_time__year = year ,
69121 created_time__month = month
70122 )
71123 return render (request , 'blog/index.html' , context = {'post_list' : post_list })
72124
73125
126+ class ArchivesView (ListView ):
127+ model = Post
128+ template_name = 'blog/index.html'
129+ context_object_name = 'post_list'
130+
131+ def get_queryset (self ):
132+ year = self .kwargs .get ('year' )
133+ month = self .kwargs .get ('month' )
134+ return super (ArchivesView , self ).get_queryset ().filter (created_time__year = year ,
135+ created_time__month = month
136+ )
137+
138+
74139def category (request , pk ):
75140 cate = get_object_or_404 (Category , pk = pk )
76141 post_list = Post .objects .filter (category = cate )
77142 return render (request , 'blog/index.html' , context = {'post_list' : post_list })
143+
144+
145+ class CategoryView (ListView ):
146+ model = Post
147+ template_name = 'blog/index.html'
148+ context_object_name = 'post_list'
149+
150+ def get_queryset (self ):
151+ cate = get_object_or_404 (Category , pk = self .kwargs .get ('pk' ))
152+ return super (CategoryView , self ).get_queryset ().filter (category = cate )
0 commit comments