1
1
import markdown
2
2
3
3
from django .shortcuts import render , get_object_or_404
4
+ from django .views .generic import ListView , DetailView
4
5
from comments .forms import CommentForm
5
6
from .models import Post , Category
6
7
@@ -25,6 +26,12 @@ def index(request):
25
26
return render (request , 'blog/index.html' , context = {'post_list' : post_list })
26
27
27
28
29
+ class IndexView (ListView ):
30
+ model = Post
31
+ template_name = 'blog/index.html'
32
+ context_object_name = 'post_list'
33
+
34
+
28
35
"""
29
36
请使用下方包含评论列表和评论表单的详情页视图
30
37
def detail(request, pk):
@@ -64,14 +71,82 @@ def detail(request, pk):
64
71
return render (request , 'blog/detail.html' , context = context )
65
72
66
73
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
+
67
119
def archives (request , year , month ):
68
120
post_list = Post .objects .filter (created_time__year = year ,
69
121
created_time__month = month
70
122
)
71
123
return render (request , 'blog/index.html' , context = {'post_list' : post_list })
72
124
73
125
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
+
74
139
def category (request , pk ):
75
140
cate = get_object_or_404 (Category , pk = pk )
76
141
post_list = Post .objects .filter (category = cate )
77
142
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