600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Django开发个人博客网站——16 给博客添加上评论功能

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

时间:2024-06-07 08:36:28

相关推荐

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_namedef __str__(self):return self.content[:10]

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

2、创建表单

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

forms.py

from django import formsfrom myblog.models import Commentclass CommentForm(forms.ModelForm):class Meta:model = Commentfields = ['name', 'content', 'blog']

3、编写视图函数

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

view.py

from django.http import HttpResponsefrom myblog.models import Blog, Category, Tag, Commentfrom myblog.forms import CommentFormclass 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 AddCommentViewurl(r'^add_comment/$', AddCommentView.as_view(), name='add_comment'),

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

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

<form class="comment-form" id="jsStayForm"><div class="form-group"><label class="name">名字: </label><input name="name" type="text" class="form-name" id="js-name" placeholder="不超过20个字"></div><div class="form-group"><label class="comment">评论:</label><textarea name="content" class="form-control" id="js-content" rows="5" placeholder="不超过300个字"></textarea></div><input name="blog" type="hidden" id="js-name" value="{{ blog.id }}"><p class="error company-tips" id="jsCompanyTips"></p><button class="btn" type="button" id="jsStayBtn" value="发表">发表</button></form>

由于我们不是直接将表单内容提交到后端,而是通过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。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。