首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django评论库

Django评论库

作者头像
菲宇
发布2019-06-13 11:33:18
9870
发布2019-06-13 11:33:18
举报
文章被收录于专栏:菲宇菲宇

评论的功能打算用Django的评论库,添加引用却报错。

查了一下,Django原本会自带一个评论库组件,而从1.6版本以后就没有自带了,需要自己安装。

运行 pip install django-contrib-comments

如下修改setting.py文件

  1. INSTALLED_APP=(
  2. #...,
  3. 'django_comments',
  4. 'django.contrib.sites',
  5. )
  6. SITE_ID = 1

在INSTALLED_APP添加django_comments和django.contrib.sites两个应用。

在外部添加 SITE_ID=1。

django的评论库是一个站点,所以需要添加sites的应用并设置当前django工程的站点id=1

记得在urls.py添加django_comments的路由设置,url中加入如下代码:

  1. url(r'^comments/', include('django_comments.urls')),

执行 python ./manage.py syncdb 同步一下数据库即可。

接着,修改前端页面显示评论列表和评论提交表单。这些需要使用django_comments的模版标签,在使用标签之前导入加载:

  1. {# 导入评论库模块的模版标签 #}
  2. {% load comments %}

评论列表可以通过django_comments的get_comment_list模版标签获取,如下代码:

  1. <div class="panel panel-default">
  2. <div class="panel-heading">
  3. <h4>评论列表</h4>
  4. </div>
  5. <div class="panel-body">
  6. {% get_comment_list for blog as comments %}
  7. {% for comment in comments %}
  8. <div class="blog_comment" name="F{{comment.id}}">
  9. <p class="comment_title">
  10. #{{ comment.submit_date|date:"Y-m-d H:i"}} @ {{ comment.user_name }}:
  11. </p>
  12. <p class="comment_content">{{ comment.comment }}</p>
  13. </div>
  14. {% empty %}
  15. <span>暂无评论</span>
  16. {% endfor %}
  17. </div>
  18. </div>

get_comment_list模版标签的用法是for一个模版对象,as是重命名。变量得到的评论加载即可。

而评论提交表单,最主要的是提交的url和表单字段。同样也可以通过django_comments的模版标签处理,如下代码:

  1. <h4>新的评论</h4>
  2. {% get_comment_form for blog as blog_form %}
  3. <form id="comment_form"
  4. class="form-horizontal"
  5. action="{% comment_form_target %}"
  6. method="post"
  7. >
  8. {% csrf_token %}
  9. {# 必须的字段 #}
  10. {{ blog_form.object_pk }}
  11. {{ blog_form.content_type }}
  12. {{ blog_form.timestamp }}
  13. {{ blog_form.site }}
  14. {{ blog_form.submit_date }}
  15. {{ blog_form.security_hash }}
  16. {# 用户名字段,这个后面会修改为登录用户评论,无需填这个 #}
  17. <div class="control-group">
  18. <label class="control-label" for="id_name">名称: </label>
  19. <div class="controls">
  20. <input type="text"
  21. id="id_name" class="input-xlarge" name="name"
  22. placeholder="请输入您的用户名"
  23. value="{{ user.username }}" />
  24. </div>
  25. </div>
  26. {# 邮箱地址字段 #}
  27. <div class="control-group">
  28. <label class="control-label" for="id_email">邮箱: </label>
  29. <div class="controls">
  30. <input type="email"
  31. id="id_email" class="input-xlarge" name="email"
  32. placeholder="请输入您的邮箱地址"
  33. value="{{ user.email }}" />
  34. </div>
  35. </div>
  36. {# 评论内容 #}
  37. <a name="newcomment" id="newcomment"></a>
  38. <div class="control-group">
  39. <label class="control-label" for="id_comment">评论: </label>
  40. <div class="controls">
  41. <textarea rows="6"
  42. id="id_comment" class="input-xlarge comment" name="comment"
  43. placeholder="请输入评论内容">
  44. </textarea>
  45. </div>
  46. </div>
  47. {# 防垃圾评论 #}
  48. <p style="display:none;">
  49. <label for="id_honeypot">如果你在该字段中输入任何内容,你的评论就会被视为垃圾评论。</label>
  50. <input type="text" name="honeypot" id="id_honeypot">
  51. </p>
  52. {# 表单按钮 #}
  53. <div class="controls">
  54. <div class="form-actions">
  55. <input class="btn btn-info" id="submit_btn" type="submit" name="submit" value="提交"/>
  56. <input type="hidden" name="next" value="{%url 'detailblog' blog.id%}"/>
  57. </div>
  58. </div>
  59. </form>

其中我使用了一些Bootstrap的样式,可忽略。虽然现在可以提交评论了,但提交评论之后会跳转到一个很简陋的页面。

接下来用ajax写评论提交事件避免避免跳转到独立的评论页面,修正时间戳等Bug。

Django的评论库如果填写不完整,或者提交出错,就会跑到自带的页面。

关键是自带的评论页面超级不好看。所以得想方法避开。

为Comments添加Ajax功能,免得提交出错跳到自带的评论页面。

具体可参考django 简易博客开发 4 comments库使用及ajax支持提交前,先在本地验证是否填写。

  1. {% block extra_footer %}
  2. {#设置提交评论#}
  3. <script type="text/javascript">
  4. $(document).ready(function() {
  5. $('#comment_form').submit(function() {
  6. if ($("#id_honeypot").val().length!=0) {
  7. alert("Stop!垃圾评论");
  8. return false;
  9. };
  10. if ($("#id_name").val().length==0) {
  11. alert("Error:请输入您的用户名");
  12. $("#id_name").focus();
  13. return false;
  14. };
  15. if ($("#id_email").val().length==0) {
  16. alert("Error:请输入您的邮箱地址");
  17. $("#id_email").focus();
  18. return false;
  19. };
  20. var email=$("#id_email").val();
  21. if(!email.match(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/)){
  22. alert("Error:邮箱不正确!请重新输入");
  23. $("#id_email").focus();
  24. return false;
  25. }
  26. if ($("#id_comment").val().length==0){
  27. alert("Error:请输入您的评论");
  28. $("#id_comment").focus();
  29. return false;
  30. };
  31. $("#id_timestamp").value=event.timeStamp;
  32. $.ajax({
  33. type: "POST",
  34. data: $('#comment_form').serialize(),
  35. url: "{% comment_form_target %}",
  36. cache: false,
  37. dataType: "html",
  38. success: function(html, textStatus) {
  39. window.location.reload();
  40. },
  41. error: function (XMLHttpRequest, textStatus, errorThrown) {
  42. alert("评论出错," + errorThrown);
  43. }
  44. });
  45. return false;
  46. });
  47. });
  48. </script>
  49. {% endblock %}

就这样实现了ajax提交。只有后台运行出错,才会返回error错误。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档