Skip to content

Commit c2b3a98

Browse files
huangchong94yangxg
authored andcommitted
使用装饰器@require_POST (jukanntenn#88)
1 parent 8e1bbd4 commit c2b3a98

File tree

1 file changed

+38
-41
lines changed

1 file changed

+38
-41
lines changed

comments/views.py

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,51 @@
11
from django.shortcuts import render, get_object_or_404, redirect
2+
from django.views.decorators.http import require_POST
23
from blog.models import Post
34

45
from .models import Comment
56
from .forms import CommentForm
67

78

9+
@require_POST
810
def post_comment(request, post_pk):
911
# 先获取被评论的文章,因为后面需要把评论和被评论的文章关联起来。
1012
# 这里我们使用了 Django 提供的一个快捷函数 get_object_or_404,
1113
# 这个函数的作用是当获取的文章(Post)存在时,则获取;否则返回 404 页面给用户。
1214
post = get_object_or_404(Post, pk=post_pk)
1315

14-
# HTTP 请求有 get 和 post 两种,一般用户通过表单提交数据都是通过 post 请求,
15-
# 因此只有当用户的请求为 post 时才需要处理表单数据。
16-
if request.method == 'POST':
17-
# 用户提交的数据存在 request.POST 中,这是一个类字典对象。
18-
# 我们利用这些数据构造了 CommentForm 的实例,这样 Django 的表单就生成了。
19-
form = CommentForm(request.POST)
20-
21-
# 当调用 form.is_valid() 方法时,Django 自动帮我们检查表单的数据是否符合格式要求。
22-
if form.is_valid():
23-
# 检查到数据是合法的,调用表单的 save 方法保存数据到数据库,
24-
# commit=False 的作用是仅仅利用表单的数据生成 Comment 模型类的实例,但还不保存评论数据到数据库。
25-
comment = form.save(commit=False)
26-
27-
# 将评论和被评论的文章关联起来。
28-
comment.post = post
29-
30-
# 最终将评论数据保存进数据库,调用模型实例的 save 方法
31-
comment.save()
32-
33-
# 重定向到 post 的详情页,实际上当 redirect 函数接收一个模型的实例时,它会调用这个模型实例的 get_absolute_url 方法,
34-
# 然后重定向到 get_absolute_url 方法返回的 URL。
35-
return redirect(post)
36-
37-
else:
38-
# 检查到数据不合法,重新渲染详情页,并且渲染表单的错误。
39-
# 因此我们传了三个模板变量给 detail.html,
40-
# 一个是文章(Post),一个是评论列表,一个是表单 form
41-
# 注意这里我们用到了 post.comment_set.all() 方法,
42-
# 这个用法有点类似于 Post.objects.all()
43-
# 其作用是获取这篇 post 下的的全部评论,
44-
# 因为 Post 和 Comment 是 ForeignKey 关联的,
45-
# 因此使用 post.comment_set.all() 反向查询全部评论。
46-
# 具体请看下面的讲解。
47-
comment_list = post.comment_set.all()
48-
context = {'post': post,
49-
'form': form,
50-
'comment_list': comment_list
51-
}
52-
return render(request, 'blog/detail.html', context=context)
53-
# 不是 post 请求,说明用户没有提交数据,重定向到文章详情页。
54-
return redirect(post)
16+
# 用户提交的数据存在 request.POST 中,这是一个类字典对象。
17+
# 我们利用这些数据构造了 CommentForm 的实例,这样 Django 的表单就生成了。
18+
form = CommentForm(request.POST)
19+
20+
# 当调用 form.is_valid() 方法时,Django 自动帮我们检查表单的数据是否符合格式要求。
21+
if form.is_valid():
22+
# 检查到数据是合法的,调用表单的 save 方法保存数据到数据库,
23+
# commit=False 的作用是仅仅利用表单的数据生成 Comment 模型类的实例,但还不保存评论数据到数据库。
24+
comment = form.save(commit=False)
25+
26+
# 将评论和被评论的文章关联起来。
27+
comment.post = post
28+
29+
# 最终将评论数据保存进数据库,调用模型实例的 save 方法
30+
comment.save()
31+
32+
# 重定向到 post 的详情页,实际上当 redirect 函数接收一个模型的实例时,它会调用这个模型实例的 get_absolute_url 方法,
33+
# 然后重定向到 get_absolute_url 方法返回的 URL。
34+
return redirect(post)
35+
36+
else:
37+
# 检查到数据不合法,重新渲染详情页,并且渲染表单的错误。
38+
# 因此我们传了三个模板变量给 detail.html,
39+
# 一个是文章(Post),一个是评论列表,一个是表单 form
40+
# 注意这里我们用到了 post.comment_set.all() 方法,
41+
# 这个用法有点类似于 Post.objects.all()
42+
# 其作用是获取这篇 post 下的的全部评论,
43+
# 因为 Post 和 Comment 是 ForeignKey 关联的,
44+
# 因此使用 post.comment_set.all() 反向查询全部评论。
45+
# 具体请看下面的讲解。
46+
comment_list = post.comment_set.all()
47+
context = {'post': post,
48+
'form': form,
49+
'comment_list': comment_list
50+
}
51+
return render(request, 'blog/detail.html', context=context)

0 commit comments

Comments
 (0)