关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
添加了头像功能的初衷是为了修改评论列表的样式。
之前评论列表的样式很简陋,简单又丑陋。
现在修改样式如下,类似于贴吧的样式。
我之前写的评论相关博文如下:
若只看本文,可能看不明白我在说什么。需要结合上面的文章一起食用。
评论库使用django-comments评论库。打开django-comments的models.py文件。
可看见该库的Comment模型有User关联的外键。(见下图第59行代码)
其中,第80~82行代码是我自己添加上去的。具体内容见前面的评论回复相关博文。
既然有User关联的外键,我们可以用过该外键获取user对象。
结合我的网站搭建(第44天) 添加头像字段文中的代码,给User模型绑定获取头像的方法。
我们可以通过该方法轻松获取user对象的头像。
万事俱备,东风到齐。
在现有的代码可以获取用户、评论回复内容和对应的头像。
即可以不需要修改Django后台代码,只需修改模版页面的代码和css样式即可。
我调整的内容如下:
1)去掉回复链接的动画,让每个评论和回复后面显示时间和回复链接
2)整理评论和回复的ajax代码,相同部分的代码合并成一个函数
3)调整评论和回复的样式为类似贴吧的效果
原本打算合并评论框和回复框的html代码,只用一套代码。发现按照我目前的前端开发水平,还无从下手。
调整具体代码如下:
<div id="blog_comments" class="panel-body"> {% get_comment_list for blog as comments %} {% for comment in comments %} <div class="blog_comment" name="F{{comment.id}}"> <div class="comment_user"> <img class="user_avatar" src="/{{comment.user.get_avatar_url}}" alt="{{comment.user_name}}"> <p class="uesr_name">{{comment.user_name}}</p> </div> <div class="comment_body"> <div class="comment_content"> <p>{{ comment.comment }}</p> </div> <p class="comment_bottom"> <span>{{comment.submit_date|date:"Y-m-d H:i"}}</span> <span class='reply_button'> <a href='javascript:void(0);' onclick='reply_click(this);' root='{{comment.id}}' role='{{comment.id}}' base='{{comment.user_name}}'>回复</a> </span> </p> {% if comment.replies%} <ul class="comment_reply"> {% for reply in comment.replies %} <li name='F{{reply.id}}'> <img class="reply_avatar" src="/{{reply.user.get_avatar_url}}"> <div class="reply_body"> <p> {#判断是否回复评论#} {% ifequal comment.id reply.reply_to %} <span class="reply_name">{{reply.user_name}}</span> {% else %} <span class="reply_name">{{reply.user_name}}</span> <span> 回复 </span> <span class="reply_name">{{reply.reply_name}}</span> {% endifequal %} </p> <div class="reply_content"> <p>{{reply.comment}}</p> </div> <p class="comment_bottom"> <span>{{reply.submit_date|date:"Y-m-d H:i"}}</span> <span class='reply_button'> <a href='javascript:void(0);' onclick='reply_click(this);' root='{{reply.root_id}}' role='{{reply.id}}' base='{{reply.user_name}}'>回复</a> </span> </p> </div> </li> {% endfor %} </ul> {% endif %} </div> <span class="clearfix"></span> </div> {% empty %} 智慧如你,不想发表一下意见吗? {% endfor %} </div>
其中,将相关的评论信息(评论对象id,评论人的名字等)用属性的方式记录在回复链接中。
<a href='javascript:void(0);' onclick='reply_click(this);' root='{{reply.root_id}}' role='{{reply.id}}' base='{{reply.user_name}}'>回复</a>
在点击该回复链接时,先回复框的form标签相关字段写入值。
//回复按钮点击事件 function reply_click(obj){ obj = $(obj); if(obj.text()=="回复"){ //展开回复框 $(".reply_button a").text("回复"); obj.text('收起'); $("#reply_form").hide(); obj.after($("#reply_form")); $("#reply_form").slideDown(200); $("#reply_to").val(obj.attr("role")); $("#root_id").val(obj.attr("root")); $("#reply_name").val(obj.attr("base")); }else{ //收起回复框 $(".reply_button a").text("回复"); $("#reply_form").hide(); } return false; }
该回复链接还加入切换回复框显示状态的处理代码。
另外,判断若回复评论的记录不显示被回复人。减少占用的空间。
//评论提交 $('#comment_form').submit(function() { if ($("#id_honeypot").val().length!=0) {alert("Stop!垃圾评论");return false;}; if ($("#id_comment").val().length==0) {alert("Error:请输入您的评论");$("#id_comment").focus();return false;}; update_comment($('#comment_form').serialize()); return false; }); //回复提交 $('#reply_update_form').submit(function() { if ($("#id_honeypot_reply").val().length!=0) {alert("Stop!垃圾评论");return false;}; if ($("#id_comment_reply").val().length==0) {alert("Error:请输入您的回复内容");$("#id_comment").focus();return false;}; update_comment($('#reply_update_form').serialize()); return false; }); //提交评论或回复 function update_comment(form_data){ $.ajax({ type: "POST", data: form_data, url: "{% comment_form_target %}", cache: false, dataType: "json", success: function(json, textStatus) { if(json['success']){ window.location.reload(); }else{ if(json['code']==501){ alert('您尚未登录,请先登录才能评论。'); }else if(json['code']==502){ alert('您尚未激活,请先激活您的账户才能评论。'); }else{ alert('评论出错,请刷新重试\n'+json['message']); window.console.debug(json); } } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("评论出错\n请检查是否登录了或者刷新试试\n" + errorThrown); } }); }
评论和回复都是提交请求到同一个url。所以将其中相同的代码封装成update_comment函数。
该部分的代码仅供参考,实际效果还需要自己调整。
/*评论框*/ .comment_text{ width: 100%; height: 9em; overflow-y: visible;} .comment_button{ margin-top:0.5em; float: right;} .comment_button #reset_btn{ margin-right:1em;} /*评论列表*/ .blog_comment{ overflow: hidden; padding-bottom: 0.5em; border-bottom: 1px #ddd solid; margin-top: 1.5em;} #blog_comments :last-child{ border-bottom: none;} /*头像*/ .blog_comment .comment_user{ width: 70px; text-align: center; float: left;} .blog_comment .user_avatar{ border-radius: 6px; width: 64px; height: 64px;} .blog_comment .uesr_name{ font-size: 70%; margin-top: 0.5em; word-break:break-all; font-weight: bolder;} /*评论*/ .blog_comment .comment_body{ margin-left: 80px;} .blog_comment .comment_content{ min-height: 64px; padding: 0.2em; border-radius: 6px;} .blog_comment .comment_bottom{ text-align: right; padding-right: 0.3em; } .blog_comment .comment_bottom span{ color: #aaa;} /*回复*/ .blog_comment .comment_reply{ border-top: 1px #ddd dashed; padding-top: 0.2em;} .blog_comment .reply_avatar{ width: 32px; height: 32px; border-radius: 4px; float: left; margin-top:4px;} .blog_comment .reply_body{ margin-left: 40px;} .blog_comment .reply_body p{ margin: 0;} .blog_comment .reply_body .comment_bottom{ padding-top: 0.5em;} .blog_comment .reply_name{ font-weight: bolder;} .blog_comment .comment_reply li{ padding-top: 0.7em; padding-bottom: 0.5em; border-bottom: 1px #ddd dashed;}
本文主要传达我对Django评论库开发的相关文章和思路。
大部分代码都是前端代码,相信这些很难让人耐心看完。
而且单独本篇博文的代码也不全,需要配合前面写的评论库相关博文一起看才有效果。
ps:对于评论库的功能,还缺少表情功能。调整代码之后,我再尝试加入emoji表情试试。
相关专题: Django评论库开发