|
1 | 1 | from django.shortcuts import render, get_object_or_404, redirect
|
| 2 | +from django.views.decorators.http import require_POST |
2 | 3 | from blog.models import Post
|
3 | 4 |
|
4 | 5 | from .models import Comment
|
5 | 6 | from .forms import CommentForm
|
6 | 7 |
|
7 | 8 |
|
| 9 | +@require_POST |
8 | 10 | def post_comment(request, post_pk):
|
9 | 11 | # 先获取被评论的文章,因为后面需要把评论和被评论的文章关联起来。
|
10 | 12 | # 这里我们使用了 Django 提供的一个快捷函数 get_object_or_404,
|
11 | 13 | # 这个函数的作用是当获取的文章(Post)存在时,则获取;否则返回 404 页面给用户。
|
12 | 14 | post = get_object_or_404(Post, pk=post_pk)
|
13 | 15 |
|
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