BBS项目分布搭建五(评论相关)

1. 根评论逻辑实现

  1. # 在models.py文件中 修改:
  2. # 7. 评论表
  3. parent = models.ForeignKey(to='self', null=True)
  4. # 添加路由(最好放在文章详情之上):
  5. # 评论功能
  6. url(r'^comment/', views.comment),
  7. # 在views.py中 添加功能:
  8. # 10. 评论功能
  9. def comment(request):
  10. if request.is_ajax() and request.method == 'POST':
  11. back_dic = {'status': 200, 'msg': '评论成功'}
  12. # 1. 接收参数
  13. content = request.POST.get('content')
  14. article_id = request.POST.get('article_id')
  15. # 2. 验证参数
  16. if not content:
  17. back_dic['status'] = 1013
  18. back_dic['msg'] = '评论内容不能为空哦~'
  19. return JsonResponse(back_dic)
  20. if not article_id:
  21. back_dic['status'] = 1014
  22. back_dic['msg'] = '评论的文章不存在'
  23. return JsonResponse(back_dic)
  24. # 3. 验证是否登录,验证尽量的完善
  25. if not request.session.get('username'):
  26. back_dic['status'] = 1015
  27. back_dic['msg'] = '请先登录在评论'
  28. return JsonResponse(back_dic)
  29. # 4. 处理评论逻辑
  30. # 4.1 操作评论表,文章表(评论数)
  31. # 3.2 事务:保证数据安全,ACID四大特性,原子性,保证的是同一个事务中的SQL必须同时成功,同时失败
  32. # 3.3 在企业中,遇到跟财务相关的需求,尽量都要使用事务
  33. from django.db import transaction
  34. with transaction.atomic():
  35. models.Article.objects.filter(pk=article_id).update(comment_num=F('comment_num') + 1)
  36. models.Comment.objects.create(
  37. content=content,
  38. article_id=article_id,
  39. user_id=request.session.get('id'),
  40. )
  41. return JsonResponse(back_dic)
  42. return HttpResponse('ok')
  43. # 修改article_detail.html文件
  44. # 在 {% block content %} 标签中添加以下内容:
  45. {# 评论样式开始#}
  46. {% if request.session.username %}
  47. <div >
  48. <p>
  49. <span class="glyphicon glyphicon-comment"></span>发表评论
  50. </p>
  51. <p>
  52. <textarea name="" id="content" cols="30" rows="10"></textarea>
  53. </p>
  54. <p>
  55. <input type="button" class="btn btn-success commit" value="提交">
  56. </p>
  57. </div>
  58. {% endif %}
  59. {# 评论样式结束#}
  60. # 在 {% block js %} </script> 标签中添加以下内容:
  61. // 提交评论
  62. $(".commit").click(function () {
  63. // 先获取评论内容
  64. var content = $('#content').val();
  65. var article_id = '{{ article_id }}'; // 拿到文章id比对
  66. // 提交ajax
  67. $.ajax({
  68. url: '/comment/',
  69. type: 'post',
  70. data: {'content': content, article_id: article_id, },
  71. success: function (res) {
  72. console.log(res);
  73. }
  74. })
  75. })
  76. </script>



2. 评论内容前端列表样式准备

  1. # 修改article_detail.html文件
  2. # 在 {% block content %}标签中添加:
  3. {# 评论列表开始#}
  4. <div class="comment">
  5. <h1>评论列表</h1>
  6. <ul class="list-group">
  7. <li class="list-group-item">
  8. <span style="margin-right: 10px;color: #399ab2"># 1楼</span> <span style="margin-right: 10px">2022-03-08</span> <span style="color: #399ab2">吾 荒天帝</span>
  9. <span style="margin-right: 10px">{{ comment.create_time|date:'Y-m-d H:i' }}</span>
  10. <span style="color: #399ab2">{{ comment.user.username }}</span>
  11. <span><a href="" class="pull-right reply" style="text-decoration: none;">回复</a></span>
  12. <p style="margin-top: 10px;margin-left: 15px;">
  13. 一剑断万古! 他化自在,他化万古!
  14. </p>
  15. </li>
  16. <li class="list-group-item">
  17. <span style="margin-right: 10px;color: #399ab2"># 1楼</span> <span style="margin-right: 10px">2022-03-08</span> <span style="color: #399ab2">吾 荒天帝</span>
  18. <span style="margin-right: 10px">{{ comment.create_time|date:'Y-m-d H:i' }}</span>
  19. <span style="color: #399ab2">{{ comment.user.username }}</span>
  20. <span><a href="" class="pull-right reply" style="text-decoration: none;">回复</a></span>
  21. <p style="margin-top: 10px;margin-left: 15px;">
  22. 一剑断万古! 他化自在,他化万古!
  23. </p>
  24. </li>
  25. <li class="list-group-item">
  26. <span style="margin-right: 10px;color: #399ab2"># 1楼</span> <span style="margin-right: 10px">2022-03-08</span> <span style="color: #399ab2">吾 荒天帝</span>
  27. <span style="margin-right: 10px">{{ comment.create_time|date:'Y-m-d H:i' }}</span>
  28. <span style="color: #399ab2">{{ comment.user.username }}</span>
  29. <span><a href="" class="pull-right reply" style="text-decoration: none;">回复</a></span>
  30. <p style="margin-top: 10px;margin-left: 15px;">
  31. 一剑断万古! 他化自在,他化万古!
  32. </p>
  33. </li>
  34. <li class="list-group-item">
  35. <span style="margin-right: 10px;color: #399ab2"># 1楼</span> <span style="margin-right: 10px">2022-03-08</span> <span style="color: #399ab2">吾 荒天帝</span>
  36. <span style="margin-right: 10px">{{ comment.create_time|date:'Y-m-d H:i' }}</span>
  37. <span style="color: #399ab2">{{ comment.user.username }}</span>
  38. <span><a href="" class="pull-right reply" style="text-decoration: none;">回复</a></span>
  39. <p style="margin-top: 10px;margin-left: 15px;">
  40. 一剑断万古! 他化自在,他化万古!
  41. </p>
  42. </li>
  43. <li class="list-group-item">
  44. <span style="margin-right: 10px;color: #399ab2"># 1楼</span> <span style="margin-right: 10px">2022-03-08</span> <span style="color: #399ab2">吾 荒天帝</span>
  45. <span style="margin-right: 10px">{{ comment.create_time|date:'Y-m-d H:i' }}</span>
  46. <span style="color: #399ab2">{{ comment.user.username }}</span>
  47. <span><a href="" class="pull-right reply" style="text-decoration: none;">回复</a></span>
  48. <p style="margin-top: 10px;margin-left: 15px;">
  49. 一剑断万古! 他化自在,他化万古!
  50. </p>
  51. </li>
  52. </ul>
  53. </div>
  54. {# 评论列表结束#}
  55. # 在 {% block css %} <style> 标签中添加:
  56. .reply:hover {
  57. color: #9cba39;
  58. }

3. 评论后端逻辑实现

  1. # 在views.py中 文章详情页功能中添加查询评论内容:
  2. # 8. 文章详情页
  3. # 查询当前文章的所有评论
  4. comment_list = models.Comment.objects.filter(article_id=article_id).all()
  5. return render(request, 'article_detail.html', locals())
  6. # 修改article_detail.html文件
  7. # 修改 {% block js %} </script> 标签内的 // 提交ajax:
  8. // 提交ajax
  9. $.ajax({
  10. url: '/comment/',
  11. type: 'post',
  12. data: {'content': content, article_id: article_id, },
  13. success: function (res) {
  14. console.log(res);
  15. var userName = '{{ request.session.username }}'
  16. if (res.status == 200) {
  17. // 1. 清空评论框
  18. $("#content").val('');
  19. // 2. 把评论成功的信息放到页面上
  20. $("#error_msg").text(res.msg);
  21. // 3. 评论之后,渲染临时评论 // ``反引号 引用模板语法
  22. var html = `
  23. <li class="list-group-item">
  24. <span class="glyphicon glyphicon-comment"></span>
  25. <span style="color: #399ab2">${userName}</span>
  26. <p style=" margin-top: 10px;margin-left: 15px;">
  27. ${content}
  28. </p>
  29. </li>
  30. `;
  31. {#// 使用字符串引号也可以达到同样效果#}
  32. {#var html = ""#}
  33. {#html += '<li class="list-group-item">' +#}
  34. {# '<span class="glyphicon glyphicon-comment"></span>'#}
  35. {# + '<span style="color: #399ab2">' + userName + '</span>' +#}
  36. {# '<p style=" margin-top: 10px;margin-left: 15px;">' + content + '</p>' +#}
  37. {# '</li>';#}
  38. $('.list-group').append(html);
  39. }
  40. }
  41. })
  42. })
  43. </script>

4. 子评论功能实现

  1. # 在views.py中修改 评论功能 两处:
  2. # 10. 评论功能
  3. # 1. 接收参数
  4. content = request.POST.get('content')
  5. article_id = request.POST.get('article_id')
  6. parent_id = request.POST.get('parent_id') # 一处
  7. with transaction.atomic():
  8. models.Article.objects.filter(pk=article_id).update(comment_num=F('comment_num') + 1)
  9. models.Comment.objects.create(
  10. content=content,
  11. article_id=article_id,
  12. user_id=request.session.get('id'),
  13. parent_id=parent_id # 二处
  14. )
  15. return JsonResponse(back_dic)
  16. # 将 {# 评论列表开始#} 下面的 <span><a标签的 href="" 删除 达到阻止a标签默认提交问题
  17. 此外 也可以在 // 子评论 下数据提交中进行阻止
  18. # 修改 article_detail.html文件:
  19. # 修改 评论列表 内容:
  20. {# 评论列表开始#}
  21. <div class="comment">
  22. <h1>评论列表</h1>
  23. <ul class="list-group">
  24. {% for comment in comment_list %}
  25. <li class="list-group-item">
  26. <span style="margin-right: 10px;color: #399ab2"># {{ forloop.counter }}楼</span>
  27. <span style="margin-right: 10px">{{ comment.create_time|date:'Y-m-d H:i' }}</span>
  28. <span style="color: #399ab2">{{ comment.user.username }}</span>
  29. <span><a class="pull-right reply" style="text-decoration: none;" username="{{ comment.user.username }}" comment_id="{{ comment.pk }}">回复</a></span>
  30. <p style="margin-top: 10px;margin-left: 15px;">
  31. {% if comment.parent_id %}
  32. <span>@ {{ comment.parent.user.username }}</span>
  33. <p>
  34. {{ comment.content }}
  35. </p>
  36. {% else %}
  37. {{ comment.content }}
  38. {% endif %}
  39. </p>
  40. </li>
  41. {% endfor %}
  42. </ul>
  43. </div>
  44. {# 评论列表结束#}
  45. # 修改 {% block js %} </script> 标签内容:
  46. {% block js %}
  47. <script>
  48. var parent_id = null; // 定义全局变量,目的是,在提交评论的事件里使用子评论事件里的根评论id
  49. $('.active').click(function () {
  50. var is_up = $(this).hasClass('diggit'); // true false
  51. var article_id = '{{ article_id }}';
  52. var _this = $(this)
  53. // 发送ajax请求
  54. $.ajax({
  55. url: '/up_or_down/',
  56. type: 'post',
  57. data: {'is_up': is_up, article_id: article_id},
  58. success: function (res) {
  59. console.log(res);
  60. if (res.status == 200) {
  61. $('.error_msg').text(res.msg);
  62. var old_num = Number(_this.children().text());
  63. _this.children().text(old_num + 1)
  64. } else if (res.status == 1010) {
  65. $('.error_msg').append(res.msg)
  66. } else {
  67. layer.msg(res.msg)
  68. }
  69. }
  70. })
  71. })
  72. // 提交评论
  73. $(".commit").click(function () {
  74. // 先获取评论内容
  75. var content = $('#content').val();
  76. var article_id = '{{ article_id }}'; // 拿到文章id比对
  77. // 重点:如何区分是根评论还是子评论
  78. if (parent_id) {
  79. // 子评论
  80. var num = content.indexOf('\n') + 1;
  81. content = content.slice(num) // 把换行符之前的内容全部切掉
  82. }
  83. // 提交ajax
  84. $.ajax({
  85. url: '/comment/',
  86. type: 'post',
  87. data: {'content': content, article_id: article_id, parent_id: parent_id},
  88. success: function (res) {
  89. console.log(res);
  90. var userName = '{{ request.session.username }}'
  91. if (res.status == 200) {
  92. // 1. 清空评论框
  93. $("#content").val('');
  94. // 2. 把评论成功的信息放到页面上
  95. $("#error_msg").text(res.msg);
  96. // 3. 评论之后,渲染临时评论 // ``反引号 引用模板语法
  97. var html = `
  98. <li class="list-group-item">
  99. <span class="glyphicon glyphicon-comment"></span>
  100. <span style="color: #399ab2">${userName}</span>
  101. <p style=" margin-top: 10px;margin-left: 15px;">
  102. ${content}
  103. </p>
  104. </li>
  105. `;
  106. {#// 使用字符串引号也可以达到同样效果#}
  107. {#var html = ""#}
  108. {#html += '<li class="list-group-item">' +#}
  109. {# '<span class="glyphicon glyphicon-comment"></span>'#}
  110. {# + '<span style="color: #399ab2">' + userName + '</span>' +#}
  111. {# '<p style=" margin-top: 10px;margin-left: 15px;">' + content + '</p>' +#}
  112. {# '</li>';#}
  113. $('.list-group').append(html);
  114. // 根评论的id要清空
  115. parent_id = null;
  116. }
  117. }
  118. })
  119. })
  120. // 子评论
  121. $('.reply').click(function (event) {
  122. {#alert(123)#}
  123. {#阻止a标签默认提交问题其他方法#}
  124. {#return false; // 阻止默认提交, 不仅适用于a标签,还适用于form表单#}
  125. {#event.preventDefault() // 阻止默认提交#}
  126. // 子评论逻辑
  127. var userName = $(this).attr('username');
  128. // 获取根评论的id
  129. parent_id = $(this).attr('comment_id');
  130. var s = '@' + userName + '\n'
  131. $('#content').val(s).focus();
  132. })
  133. </script>
  134. {% endblock %}

BBS项目分布搭建五(评论相关功能实现)的更多相关文章

  1. BBS项目分布搭建四(点赞点踩及评论功能准备)

    BBS项目分布搭建四(点赞点踩及评论功能) 1. 点赞点踩样式准备 # 在base.html文件中 head标签内 添加css模块: {% block css %} {% endblock %} # ...

  2. BBS项目分布搭建二(个人站点相关)

    BBS项目分布搭建二 1. 首页详情补充 # 在home.html文件中 body标签内补充: <div class="container-fluid"> <di ...

  3. BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)

    BBS项目分布搭建三(个人站点时间归档补充,) 1. 个人站点时间归档 """ settings.py设置最好更改以下: LANGUAGE_CODE = 'zh-hans ...

  4. bbs项目实现点赞和评论的功能

    一.点赞功能 思路是这样的: 1.对点赞和踩都设置一个相同的class,然后对这个class绑定点击事件 2.点击触发ajax请求,我们对赞的标签设置了一个class属性,对踩的标签没有设置这个cla ...

  5. BBS项目补充知识(后台文章展示功能)

    BBS项目补充知识 1. 开放 media 文件路径 # 以用户注册页面为例 用户头像文件我们默认时保存在 根路径下的static下的img文件夹 但也可以单独放置在指定路径下 # 根路径下创建 me ...

  6. .Net Core3.0 WebApi 项目框架搭建 五: 轻量型ORM+异步泛型仓储

    .Net Core3.0 WebApi 项目框架搭建:目录 SqlSugar介绍 SqlSugar是国人开发者开发的一款基于.NET的ORM框架,是可以运行在.NET 4.+ & .NET C ...

  7. .Net Core3.0 WebApi 项目框架搭建 五:仓储模式

    .Net Core3.0 WebApi 项目框架搭建:目录 理论介绍 仓储(Respository)是存在于工作单元和数据库之间单独分离出来的一层,是对数据访问的封装.其优点: 1)业务层不需要知道它 ...

  8. 如何在项目中使用composer的相关功能

    最近要在公司的magento项目中引用第三方库,用了composer来进行管理,composer还是非常方便的: 1.在应用的根目录下添加文件:composer.json {    "nam ...

  9. 潭州课堂25班:Ph201805201 django 项目 第十五课 用户注册功能后台实现 (课堂笔记)

    前台:判断用户输入 ,确认密码,手机号, 一切通过后向后台发送请求, 请求方式:post 在 suers 应用下的视图中: 1,创建个类, 2,创建 GET 方法,宣言页面 3,创建  POST 方法 ...

随机推荐

  1. 学习JDBC遇到的一些问题

    1. 数据库版本与驱动对应问题 参考官方文档:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html 具体详情还需 ...

  2. 利用纯代码写出一个秒表表盘的方法 —— #DF

    @interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...

  3. 【NetCore】依赖注入的一些理解与分享

    依赖注入 DI 前言 声明:我是一个菜鸟,此文是自己的理解,可能正确,可能有误.仅供学习参考帮助理解,如果直接拷贝代码使用造成损失概不负责. 相关的文章很多,我就仅在代码层面描述我所理解的依赖注入是个 ...

  4. 详解Java12新增语法switch表达式

    引言 在学习分支语句的时候,我们都学过 switch 语句,相比于 if-else 语句,他看起来更加整洁,逻辑更加清晰,Java中当然也给我们提了相关的 switch 方法.但是Java的强大之处在 ...

  5. CentOS虚拟机关闭防火墙

    关闭防火墙 systemctl stop firewalld 关闭防火墙开机自启动 systemctl disable firewalld 关闭安全机制,将selinux设置为disabled vi ...

  6. Linux基础:操作系统的启动

    Centos6: # 1.加电自检(BIOS)# 2.MBR引导(512k)dd </dev/zero >/dev/sda bs=1k count=400 # 3.GRUB菜单(选择系统) ...

  7. Solution -「ARC 126F」Affine Sort

    \(\mathcal{Description}\)   Link.   给定 \(\{x_n\}\),令 \[f(k)=\left|\{(a,b,c)\mid a,b\in[0,c),c\in[1,k ...

  8. Session是什么?它与Cookie有什么区别?

    你好,是我琉忆. 今天我们讲一讲Session与Cookie的区别 1.Session对象 上一节简单介绍了Cookie,接下来简单介绍Session.Session和Cookie都是会话管理技术的一 ...

  9. linux可以这样玩 之 杂乱无章的随笔(不定期更新)

    文章目录 快速重命名 vim的进化 vim高亮当前行 vim列编辑 vim块编辑 vim行编辑 vim 中替换内容 vim保留当前已经编辑的内容,切换到其他用户继续编辑 修改服务的进程限制 CentO ...

  10. Python中random模块的用法案例

    1 import random # 调用random模块 2 3 a = random.random() # 随机从0-1之间抽取一个小数 4 print(a) 5 6 a = random.rand ...