Django开发个人博客网站——16、给博客添加上评论功能

博客中的评论系统其实是个很复杂的东西,但是网上已经有现成的轮子了,比如django-contrib-comments,可以直接拿过来用。但是我这里博客主要是给自己看的,并不想有太复杂的互动内容,因此,就自己写了个非常简答的仅能提供一级评论,且不需要注册的评论功能。

1、添加评论模型

评论也是需要记录在数据库中的,因此我们需要在models.py中为它创建一个模型,由于我们不提供注册服务,因此,只需要用户输入用户名跟内容就可以了,模型如下所示:

models.py

class Comment(models.Model):

    name = models.CharField(verbose_name='姓名', max_length=20, default='佚名')
    content = models.CharField(verbose_name='内容', max_length=300)
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    blog = models.ForeignKey(Blog, verbose_name='博客')

    class Meta:
        verbose_name = '博客评论'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.content[:10]

当然,不要忘了添加到admin.py中,和之前的博客、分类、标签一样。

2、创建表单

django的表单,是django很重要的一样内容,具体内容我们就不再介绍了,可以查看官方文档,我们这里采用ModelForm获取表单内容,在myblog app下新建一个forms.py的文件:

forms.py

from django import forms
from myblog.models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['name', 'content', 'blog']

3、编写视图函数

在视图函数中,我们通过json来向前端传递参数,并通过ajax异步的方式进行评论:

view.py

from django.http import HttpResponse
from myblog.models import Blog, Category, Tag, Comment
from myblog.forms import CommentForm

class AddCommentView(View):

    def post(self, request):
        comment_form = CommentForm(request.POST)
        if comment_form.is_valid():
            comment_form.save()
            return HttpResponse('{"status": "success"}', content_type='application/json')
        else:
            return HttpResponse('{"status": "fail"}', content_type='application/json')

添加完评论的视图函数后,还记得要在博客详情视图函数中将该博客的评论内容传递到前端。

4、创建评论的url

from myblog.views import AddCommentView

url(r'^add_comment/$', AddCommentView.as_view(), name='add_comment'),

5、在博客详情页面添加上评论

由于我们采用的是ajax异步方式对网页进行评论操作,因此需要添加相应的script函数,相关代码可以从我的GitHub获得,链接在该系类的第一节。这里针对如下form表单进行相关讲解:

class="comment-form" id="jsStayForm"> <div class="form-group"> name="name" type="text" class="form-name" id="js-name" placeholder="不超过20个字"> div> <div class="form-group"> div> name="blog" type="hidden" id="js-name" value="{{ blog.id }}">

class="error company-tips" id="jsCompanyTips">

由于我们不是直接将表单内容提交到后端,而是通过ajax提交,因此提交按钮要改为button,而不是submit。CommentForm中要获取blog内容,我们这里其实并不包括blog字段,为此我们需要在创建一个类型为‘hidden’的input框,通过这种方式将blog传递过去。

最后就是ajax的相关代码,如下所示:


{% block content_js %}
<script>
    $(function(){
        $('#jsStayBtn').on('click', function(){

            $.ajax({
                cache: false,
                type: "POST",
                url:"/add_comment/",
                data:$('#jsStayForm').serialize(),
                dateType:"json",
                async: true,
                beforeSend:function(xhr, settings){
                xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
            },
                success: function(data) {
                    if(data.status == 'success'){
                        alert("提交成功");
                         window.location.reload();//刷新当前页面.
                    }else if(data.status == 'fail'){
                        alert("评论错误,请重新评论");
                    }
                },
            });
        });
    })

script>
{% endblock %}

表单的csrf验证我们放在这里了,也就是在传递数据的地方进行验证,验证内容可以通过前端查看源码的方式看到。

评论的展示通过for循环很容易实现:

        {% for comment in all_comment %}
            <li class="comment-item">
            <hr class="the-line"  />
                <span class="nickname">{{ comment.name }} - span>
                <time class="submit-date"
                      datetime="{{ comment.create_time }}">{{ comment.create_time|date:"Y/m/d   h:m" }}time>
                <p class="floor">{{ forloop.counter }} #  p>
                <div style="word-wrap: break-word">
                        {{ comment.content }}
                div>

            li>
        {% empty %}
            暂无评论
        {% endfor %}

当然,这个自己创建的评论系统并没有太多样式,也没有二级回复功能,可以说是非常简陋了,日后有机会会再对它进行完善的。

但是,个人觉得还是不太喜欢需要各种注册,界面丑陋的评论系统。如果能实现不需要注册且简洁大方还可以通过回复与读者交流,那就最好了。

——————————————————————————————————————————

项目的完整代码:django_blog
觉得有用的欢迎给个star。

你可能感兴趣的:(django)