detail.html 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. {% extends "base.html" %}
  2. {% load static %}
  3. {% block title %}
  4. 文章详情:{{ article.title }}
  5. {% endblock title %}
  6. {% block content %}
  7. <header class="masthead" id="masthead" style="background-image: url({{ article.avatar.url }}) !important;">
  8. <div class="overlay"></div>
  9. <div class="container">
  10. <div class="row">
  11. <div class="col-lg-12 col-md-10 mx-auto">
  12. <div class="site-heading no-gutter" data-aos="fade-up" data-aos-delay="100">
  13. <h1>{{ article.title }}</h1>
  14. </div>
  15. </div>
  16. </div>
  17. </div>
  18. </header>
  19. <div class="container" id="content">
  20. <div class="row">
  21. <div class="col-3 mt-4 sidebar" id="sidebar">
  22. <div class="sidebar__inner">
  23. <h4 data-aos="fade-up" data-aos-delay="100"><strong>目录</strong></h4>
  24. <hr>
  25. <div data-aos="fade-up" data-aos-delay="140">
  26. {{ toc|safe }}
  27. </div>
  28. </div>
  29. </div>
  30. <div class="col-9">
  31. <h1 class="mt-4 mb-4" data-aos="fade-up" data-aos-delay="100">
  32. {{ article.title }}
  33. </h1>
  34. <div class="col-12 alert alert-success" data-aos="fade-up" data-aos-delay="120">
  35. 作者: {{ article.author }}
  36. {% if user == article.author %}
  37. · <a href="#" onclick="confirm_delete()">
  38. 删除文章
  39. </a>
  40. · <a href="{% url 'article:article_update' article.id %}">
  41. 编辑文章
  42. </a>
  43. {% endif %}
  44. &nbsp;&nbsp;浏览:{{ article.total_views }}
  45. <form style="display: none"
  46. id="safa_delete"
  47. action="{% url 'article:article_safe_delete' article.id %}"
  48. method="post"
  49. >
  50. {% csrf_token %}
  51. <button type="submit">
  52. 发送
  53. </button>
  54. </form>
  55. </div>
  56. <div class="col-12" data-aos="fade-up" data-aos-delay="160">
  57. <p>
  58. {{ article.body|safe }}
  59. </p>
  60. </div>
  61. <hr data-aos="fade-up" data-aos-delay="160">
  62. {% if user.is_authenticated %}
  63. <div data-aos="fade-up" data-aos-delay="140">
  64. <form action="{% url 'comment:post_comment' article.id %}" method="post">
  65. {% csrf_token %}
  66. <div class="form-group">
  67. <label for="body">
  68. <strong>
  69. 发表评论
  70. </strong>
  71. </label>
  72. <!--<textarea type="text" class="form-control" id="body" name="body" rows="2"></textarea>-->
  73. <div>
  74. {{ comment_form.media }}
  75. {{ comment_form.body }}
  76. </div>
  77. </div>
  78. <button type="submit" class="btn btn-primary">发送</button>
  79. </form>
  80. </div>
  81. <br>
  82. {% else %}
  83. <br>
  84. <h5 class="row justify-content-center" data-aos="fade-up" data-aos-delay="140">
  85. 请<a href="{% url 'userprofile:login' %}">登录</a>后回复
  86. </h5>
  87. <br>
  88. {% endif %}
  89. {% load mptt_tags %}
  90. <h4 data-aos="fade-up" data-aos-delay="160">共有{{ comments.count }}条评论</h4>
  91. <div class="row" data-aos="fade-up" data-aos-delay="180">
  92. <!-- 遍历树形结构 -->
  93. {% recursetree comments %}
  94. <!-- 给 node 取个别名 comment -->
  95. {% with comment=node %}
  96. <div class="{% if comment.reply_to %}
  97. offset-1 col-11
  98. {% else %}
  99. col-12
  100. {% endif %}">
  101. <hr>
  102. <p>
  103. <strong style="color: pink">
  104. {{ comment.user }}
  105. </strong>
  106. {% if comment.reply_to %}
  107. <i class="far fa-arrow-alt-circle-right"
  108. style="color: cornflowerblue;"
  109. ></i>
  110. <strong style="color: pink">
  111. {{ comment.reply_to }}
  112. </strong>
  113. {% endif %}
  114. </p>
  115. <div>{{ comment.body|safe }}</div>
  116. <div>
  117. <span style="color: gray">
  118. {{ comment.created|date:"Y-m-d H:i" }}
  119. </span>
  120. <!-- 加载 modal 的按钮 -->
  121. {% if user.is_authenticated %}
  122. <button type="button"
  123. class="btn btn-light btn-sm text-muted"
  124. onclick="load_modal({{ article.id }}, {{ comment.id }})">
  125. 回复
  126. </button>
  127. {% else %}
  128. <a class="btn btn-light btn-sm text-muted"
  129. href="{% url 'userprofile:login' %}">
  130. 回复
  131. </a>
  132. {% endif %}
  133. </div>
  134. <!-- Modal -->
  135. <div class="modal fade"
  136. id="comment_{{ comment.id }}"
  137. tabindex="-1"
  138. role="dialog"
  139. aria-labelledby="CommentModalCenter"
  140. aria-hidden="true">
  141. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  142. <div class="modal-content" style="height: 480px">
  143. <div class="modal-header">
  144. <h5 class="modal-title" id="exampleModalCenterTitle">
  145. 回复 {{ comment.user }}:</h5>
  146. </div>
  147. <div class="modal-body" id="modal_body_{{ comment.id }}"></div>
  148. </div>
  149. </div>
  150. </div>
  151. {% if not comment.is_leaf_node %}
  152. <div class="children">
  153. {{ children }}
  154. </div>
  155. {% endif %}
  156. </div>
  157. {% endwith %}
  158. {% endrecursetree %}
  159. </div>
  160. </div>
  161. </div>
  162. </div>
  163. <script>
  164. function confirm_delete() {
  165. layer.open({
  166. title: "删除文章",
  167. content: "确认删除这篇文章吗?",
  168. yes: function (index, layero) {
  169. $('form#safe_delete button').click();
  170. layer.close(index);
  171. },
  172. })
  173. }
  174. </script>
  175. <script src="{% static 'ckeditor/ckeditor/plugins/prism/lib/prism/prism_patched.min.js' %}"></script>
  176. <!-- 粘性侧边栏样式 -->
  177. <style>
  178. .sidebar {
  179. will-change: min-height;
  180. }
  181. .sidebar__inner {
  182. transform: translate(0, 0);
  183. transform: translate3d(0, 0, 0);
  184. will-change: position, transform;
  185. }
  186. </style>
  187. <link rel="stylesheet" href="{% static 'prism/prism.css' %}">
  188. {% endblock content %}
  189. {% block script %}
  190. <script src="{% static 'sticky_sidebar/jquery.sticky-sidebar.min.js' %}"></script>
  191. <script src="{% static 'article/detail.js' %}"></script>
  192. {% endblock script %}