Skip to content

Commit de9ffd5

Browse files
author
yangxg
committed
Merge branch 'Step18_class-based-views'
2 parents 846ee8e + d141e88 commit de9ffd5

File tree

2 files changed

+79
-4
lines changed

2 files changed

+79
-4
lines changed

blog/urls.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
app_name = 'blog'
66
urlpatterns = [
7-
url(r'^$', views.index, name='index'),
8-
url(r'^post/(?P<pk>[0-9]+)/$', views.detail, name='detail'),
9-
url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', views.archives, name='archives'),
10-
url(r'^category/(?P<pk>[0-9]+)/$', views.category, name='category'),
7+
url(r'^$', views.IndexView.as_view(), name='index'),
8+
url(r'^post/(?P<pk>[0-9]+)/$', views.PostDetailView.as_view(), name='detail'),
9+
url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', views.ArchivesView.as_view(), name='archives'),
10+
url(r'^category/(?P<pk>[0-9]+)/$', views.CategoryView.as_view(), name='category'),
1111
]

blog/views.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import markdown
22

33
from django.shortcuts import render, get_object_or_404
4+
from django.views.generic import ListView, DetailView
45
from comments.forms import CommentForm
56
from .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
请使用下方包含评论列表和评论表单的详情页视图
3037
def 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+
67119
def 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+
74139
def 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

Comments
 (0)