博客中的评论系统其实是个很复杂的东西,但是网上已经有现成的轮子了,比如django-contrib-comments,可以直接拿过来用。但是我这里博客主要是给自己看的,并不想有太复杂的互动内容,因此,就自己写了个非常简答的仅能提供一级评论,且不需要注册的评论功能。
评论也是需要记录在数据库中的,因此我们需要在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中,和之前的博客、分类、标签一样。
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']
在视图函数中,我们通过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')
添加完评论的视图函数后,还记得要在博客详情视图函数中将该博客的评论内容传递到前端。
from myblog.views import AddCommentView
url(r'^add_comment/$', AddCommentView.as_view(), name='add_comment'),
由于我们采用的是ajax异步方式对网页进行评论操作,因此需要添加相应的script函数,相关代码可以从我的GitHub获得,链接在该系类的第一节。这里针对如下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。