博客评论相关

博客文章详情页搭建

{% extends 'base.html' %}
{% block css %}
<style>
#div_digg {
float: right;
margin-bottom: 10px;
margin-right: 30px;
font-size: 12px;
width: 125px;
text-align: center;
margin-top: 10px;
} #div_digg .diggnum {
line-height: 1.5em !important;
} .diggit {
float: left;
width: 46px;
height: 52px;
background: url(/static/img/up.gif) no-repeat;
text-align: center;
cursor: pointer;
margin-top: 2px;
padding-top: 5px;
} .buryit {
float: right;
margin-left: 20px;
width: 46px;
height: 52px;
background: url(/static/img/down.gif) no-repeat;
text-align: center;
cursor: pointer;
margin-top: 2px;
padding-top: 5px;
} .clear {
clear: both;
} #div_digg .diggnum {
line-height: 1.5em !important;
} .diggword {
margin-top: 5px;
margin-left: 0;
font-size: 12px;
color: gray;
}
</style>
{% endblock %} {% block right_content %}
{# 文章及标题开始 #}
<h3>{{ article_obj.title }}</h3>
{{ article_obj.content|safe }}
{# 文章结束 #}
{# 点赞点踩开始 #}
<div class="clearfix">
<div id="div_digg">
<div class="diggit action">
<span class="diggnum" id="digg_count">{{ article_obj.up_num }}</span>
</div>
<div class="buryit action">
<span class="burynum" id="bury_count">{{ article_obj.down_num }}</span>
</div>
<div class="clear"></div>
<div class="diggword" id="digg_tips">
</div>
</div>
</div>
{# 点赞点踩结束 #}
{# 评论楼开始 #}
<div><h4>评论</h4></div>
{% for comment in comment_list %}
<hr>
<div>
<span>#{{ forloop.counter }}楼&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span><span class="glyphicon glyphicon-time"></span>&nbsp;{{ comment.comment_time|date:'Y-m-d' }}&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span><span class="glyphicon glyphicon-user"></span>&nbsp;<a href="/{{ comment.user }}/">{{ comment.user }}</a></span>
<span class="pull-right reply " id="id_reply" username="{{ comment.user.username }}" comment_id="{{ comment.pk }}"><span class="glyphicon glyphicon-comment"></span>&nbsp;<a >回复</a></span>
</div>
<div> {% if comment.parent %}
<div>@{{ comment.parent.user.username }}</div>
{% endif %}
<div>{{ comment.content }}</div>
</div>
{% endfor %}
<div class="linshi_comment"></div> {# 评论楼结束 #}
{# 评论输入 开始 #}
<hr>
<div><span class="glyphicon glyphicon-comment"></span>&nbsp;&nbsp;&nbsp;发表评论</div> <div style="margin-top: 20px">
<span class="glyphicon glyphicon-user"></span>
<span>&nbsp;&nbsp;&nbsp;昵称:&nbsp;&nbsp;&nbsp;{{ request.user.username }}</span>
</div>
<div style="margin-top: 20px">
<span>评论内容:</span>
</div>
<div>
<textarea name="comment" id="id_comment" cols="60" rows="10"></textarea> </div>
<button class="btn btn-primary" id="id_submit_comment" style="margin-left: 400px; margin-top: 20px">提交</button> {# 评论输入结束 #}
{% endblock %} {% block js %}
<script>
// 点赞点踩 点击事件绑定
$('.action').click(function () {
let isUp = $(this).hasClass('diggit');
let $info = $('#digg_tips');
let $span = $(this).children();
$.ajax({
url: "/up_or_down/",
type: 'post',
data: {
'article_id':{{ article_obj.pk }},
'is_up': isUp,
'csrfmiddlewaretoken': '{{ csrf_token }}',
},
success: function (data) {
if (data.code == 200) {
console.log(data);
$info.html(data.msg);
//将span标签内的文本加1
$span.text(Number($span.text() + 1))
}
else {
$info.html(data.msg)
}
}
})
});
//{#评论js开始#}
// 先定义一个全局的 parent
let parentId='';
$('#id_submit_comment').click(function () {
// 获取textarea 文本内容
let $comment_content = $('#id_comment').val();
//判断parentId 是否有值,有值则进行切分
if (parentId){
// 获取切分的索引(切分的时候 顾头不顾尾,所以需要加1)
let indexVal = $comment_content.indexOf('\n')+1;
$comment_content=$comment_content.slice(indexVal);
}
// 发送ajax请求
$.ajax({
url: '/comment/',
type: 'post',
data: {
'article_id': '{{ article_id }}',
'comment_content': $comment_content,
'csrfmiddlewaretoken': '{{ csrf_token }}',
'parent_id': parentId
},
success: function (data) {
// 将新的评论临时渲染到前端页面
if (data.code == 100) {
let userName = '{{ request.user.username }}';
let commentConent = $comment_content;
//此处用的是前端的模板语言的替换
let tempStr = `
<div>
<hr>
<span><span class="glyphicon glyphicon-user"></span>&nbsp;<a href="/${userName}/">${userName}</a></span>
<p>${commentConent}</p>
</div>
`;
// 查找url标签,添加子元素
$('.linshi_comment').append(tempStr);
// 将textarea文本框清空
$('#id_comment').val('');
}
}
}) });
// 回复父评论信息
$('.reply').click(function () {
// 把你想评论的那条评论的任命自动添加到 textarea 文本中去
let pUserName=$(this).attr('username');
let pCommentId=$(this).attr('comment_id');
// 自动换行
$('#id_comment').val('@'+pUserName+'\n');
// 聚焦到评论文本框
$('#id_comment').focus();
//给parent_id 赋值
parentId=pCommentId;
});
</script>
{% endblock %}

博客详情页后端视图函数

# 将博客文章内容 以及评论的列表传导前端

# url.py 中的对应路由
url(r'^(?P<username>\w+)/article/(?P<article_id>\d+)',views.article_detail) # views.py
def article_detail(request, username, article_id):
# 从数据库中查找文章对象
article_obj = models.Article.objects.filter(pk=article_id).first()
# 查找当前用户对象
user_obj = models.UserInfo.objects.filter(username=username).first()
# 查找评论的queryset对象
comment_list= models.Comment.objects.filter(article_id=article_id)
return render(request, 'article_detail.html', locals()) # 评论 视图函数 路由
url('/comment/',views.comment) # views.py
def comment(request):
back_dic = {'code': 100, 'msg': ''}
if request.is_ajax():
article_id = request.POST.get('article_id')
comment_content = request.POST.get('comment_content')
parent_id = request.POST.get('parent_id')
print('article_id', article_id)
print('comment', comment_content)
# 1.先校验当前用户是否已经登录
if request.user.is_authenticated():
# 开启事务操作 // from django.db import transaction
with transaction.atomic():
# 1.在文章表中将普通字段加1
models.Article.objects.filter(pk=article_id).update(comment_num=F('comment_num') + 1)
# 2.在评论表中将存储真正的数据
models.Comment.objects.create(article_id=article_id, user=request.user, content=comment_content,parent_id=parent_id)
back_dic['msg'] = '评论成功'
else:
back_dic['code'] = 101
back_dic['msg'] = '请先登录'
return JsonResponse(back_dic)

最新文章

  1. mongodb
  2. JAVA基础知识之Annotation
  3. mysql找回密码
  4. 【数据库】 防止sql注入,过滤敏感关键字
  5. Navicat(连接) -1之SSL 设置
  6. Android开发 |常见的内存泄漏问题及解决办法
  7. HW4.10
  8. 50个Android开发技巧(10 为TextView加入样式)
  9. 使用jquery-mockjax模拟ajax请求做前台測试
  10. 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?
  11. 我的hibernate学习记录(二)
  12. SecureCRT设置linux终端显示颜色
  13. MyBatis的好处及常见问题
  14. Day18--Python--面向对象--类与类之间的关系
  15. 统计php-fpm内存占用
  16. 基于tensorflow的简单线性回归模型
  17. 为 github markdown 文件生成目录(toc)
  18. LINQ Group By操作(转载)
  19. 如何选取一个神经网络中的超参数hyper-parameters
  20. [YARN] 2.2 GB of 2.1 GB virtual memory used. Killing container.

热门文章

  1. 【JZOJ100209】【20190705】狂妄之人
  2. 【louguP2234】[HNOI2002]营业额统计(链表)
  3. 基于Linux(中标麒麟)上QT的环境搭建
  4. #ifndef #define #endif
  5. Ansible之playbook的使用
  6. Scala词法文法解析器 (一)解析SparkSQL的BNF文法
  7. python对图片批量命名
  8. 解决mybatis中#{}导致的The error may involve defaultParameterMap的问题
  9. Lab7:同步互斥
  10. 关于深度学习框架 TensorFlow、Theano 和 Keras