首先还是贴一下源代码地址  https://github.com/goodspeedcheng/sblog

上一篇文章我们介绍了静态文件使用以及如何使用from实现对blog的增删改,这篇将介绍如何给blog添加评论模块

1、添加comments库

comments库是是django框架内置的一个评论库,可以快速的搭建岀一个评论系统,不过再自定义方面有些麻烦,不想用的话也可以自己动手编写

comments 文档地址 https://docs.djangoproject.com/en/1.4/ref/contrib/comments/

激活comments方法

  • 在setting.py INSTALLED_APP 添加 'django.contrib.comments',
  • 更新数据库 :执行 python manage.py syncdb
  • 添加comments url到项目urls.py
    urlpatterns = patterns('',
    ...
    (r'^comments/', include('django.contrib.comments.urls')),
    ...
    )

    在templates 中使用  comment template tags

因为settings.py中的INSTALLED_APPS中的django.contrib.sites我们早已取消注释,现在打开 admin 就能管理评论了

2、在模板中使用comments

导入自定义标签即可。

{% load comments %}

 # 统计评论数量
{% get_comment_count for blog as comment_count %}
<p>This event has {{ comment_count }} comments.</p> # 显示评论 默认comments/list.html 模板
{% render_comment_list for event %} # 自定义显示评论列表
{% get_comment_list for [object] as [varname] %}
例如
{% get_comment_list for event as comment_list %}
{% for comment in comment_list %}
...
{% endfor %} # 显示评论提交表单
{% get_comment_form for blog as form %}
<table>
<form action="{% comment_form_target %}" method="post">
{% csrf_token %}
{{ form }}
<tr>
<td colspan="2">
<input type="submit" name="submit" value="Post">
<input type="submit" name="preview" value="Preview">
</td>
</tr>
</form>
</table>

这些都是comments库内置的一些方法和属性,有些可以直接使用,但是comments表单不是我们想要,我们要按自己的要求来

3、自定义评论表单

首先上代码

 1 {% block comments %}
2 <article id="cmt">
3 {% get_comment_count for blog as comment_count %}
4 <h4 class="muted comtop">{{ comment_count }} Comments</h4>
5 <hr class="soften">
6 {% get_comment_list for blog as blog_com %}
7 {% for comment in blog_com %}
8 <div class="container-fluid none-padding">
9 <p class="muted"><small>{{ comment.user }}</small><small>{{ comment.submit_date|date:"F,j,Y" }}</small></p>
10 {{ comment.comment }}
11 </div>
12 <hr class="soften">
13 {% endfor %}
14 </article>
15
16 <article >
17 {% get_comment_form for blog as blog_form %}
18 <div id="comment_form">
19 <h4 class="muted comtop">New Comments</h4>
20 <form class="form-horizontal" action="{% comment_form_target %}" method="post">
21 <fieldset>
22 {% csrf_token %}
23 {{ blog_form.object_pk }}
24 {{ blog_form.content_type }}
25 {{ blog_form.timestamp }}
26 {{ blog_form.site }}
27 {{ blog_form.submit_date }}
28 {{ blog_form.security_hash }}
29 <div class="control-group">
30 <label class="control-label" for="id_name">name: </label>
31 <div class="controls">
32 <input type="text" id="id_name" class="input-xlarge" name="name" placeholder="please enter name" required="required">
33 </div>
34 </div>
35 <div class="control-group">
36 <label class="control-label" for="id_email">email: </label>
37 <div class="controls">
38 <input class="input-xlarge" id="id_email" type="email" name="email" placeholder="please enter email" required="required">
39 </div>
40 </div>
41 <div class="control-group">
42 <label class="control-label" for="id_comment">comment: </label>
43 <div class="controls">
44 <textarea class="input-xlarge comment" id="id_comment" name="comment" placeholder="please enter comment" required="required"></textarea>
45 </div>
46 </div>
47 <p style="display:none;"><label for="id_honeypot">如果你在该字段中输入任何内容,那么你的评论就会被视为垃圾评论。</label> <input type="text" name="honeypot" id="id_honeypot"></p>
48 <div class="form-actions">
49 <input class="btn btn-info" type="submit" name="submit" value="Post">
50 {# <input class="btn btn-info" type="submit" name="preview" value="Preview"> #}
51 <input type='hidden' name='next' value='{% url detailblog blog.id %}'/>
52 </div>
53 </fieldset>
54 </form>
55 </div>
56 </article>
57 {% endblock %}

现在再打开博客页面就会发现下面出现来自定义后的评论表单,但是我们现在提交会发现

CSRF verification failed. Request aborted.

解决方法: 只需要将views.py中 blog_show

return render_to_response("blog_show.html", {"blog": blog})
改为
return render_to_response("blog_show.html", {"blog": blog}, context_instance=RequestContext(request))

现在是不是成功了呢

表单中包含字段:

  1. csrfmiddlewaretoken——django csrf中间件需要
  2. content_type—— 内容类型
  3. content_pk——ID值
  4. site—— 站点
  5. user—— 用户对象
  6. timestamp——当前时间
  7. security_hash——安全检测用
  8. name——名称
  9. email——邮箱
  10. comment——内容
  11. submit_date——提交日期
  12. honeypot——防止机器乱填垃圾信息

现在我们来说一下自定义comments form的关键吧

  • 自定义表单时,一定要加上{% csrf_token %}这句,因为comments 使用的是post方法
  • 使用默认表但是,comments会自动把所有字段补齐,我们也应该这样,否则会提交失败
    {{ blog_form.object_pk }}
    {{ blog_form.content_type }}
    {{ blog_form.timestamp }}
    {{ blog_form.site }}
    {{ blog_form.submit_date }}
    {{ blog_form.security_hash }}

    honeypot字段是用于防止机器程序发布垃圾信息的。文档里的说法是:一般机器程序发布垃圾信息时,会把表单里的所有字段都填上,而这个字段一旦被填上则此信息将被判为垃圾信息所以这个不能填写

    如果评论表单未提交成功,则comments库会自动加载其源码中的comments/preview.html这个默认模板,提醒用户表单项有误。但需要注意的是这个模板会很丑陋,故你可以在自己的项目中复制这个模板(路径要保证是templates/comments/preview.html即可),重写你自己的提醒内容,加上自己设计的样式。

4、添加ajax支持

首先在blog_show.html添加

{% block script %}
<script type="text/javascript" charset="utf-8">
function bindPostCommentHandler() {
$('#comment_form form input.submit-preview').remove();
$('#comment_form form').submit(function() {
$.ajax({
type: "POST",
data: $('#comment_form form').serialize(),
url: "{% comment_form_target %}",
cache: false,
dataType: "html",
success: function(html, textStatus) {
$('#cmt').replaceWith(html);
$('#comment_form form')[0].reset();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$('#comment_form form').replaceWith('Your comment was unable to be posted at this time. We apologise for the inconvenience.');
}
});
return false;
});
} $(document).ready(function() {
bindPostCommentHandler();
});
</script>
{% endblock %}

首先定义 bindPostCommentHandler 方法

下一行移除 preview button

使用jquery ajax 方法以post形式提交数据 如果成功 将 cmt块替换为 html 内容 并将form重置

return false 作用是禁用form 中action 方法

现在提交数据会发现#cmt 被完整的页面替换掉了,这不是我们想要的结果

解决方法:

修改自定义表单中最后一行(这一行的作用是提交完表单后跳转的页面)

<input type='hidden' name='next' value='{% url detailblog blog.id %}'/>

<input type='hidden' name='next' value='{% url showcomment blog.id %}'/>

相应的在urls.py添加

url(r'^blog/(?P<id>\d+)/commentshow/$', 'blog_show_comment', name='showcomment'),

在views.py添加

def blog_show_comment(request, id=''):
blog = Blog.objects.get(id=id)
return render_to_response('blog_comments_show.html', {"blog": blog})

新建blog_comments_show.html 内容为

{% load comments %}
<article id="cmt">
{% get_comment_count for blog as comment_count %}
<h4 class="muted comtop">{{ comment_count }} Comments</h4>
<hr class="soften">
{% get_comment_list for blog as blog_com %}
{% for comment in blog_com %}
<div class="container-fluid none-padding">
<p class="muted"><small>{{ comment.user }}</small><small>{{ comment.submit_date|date:"F,j,Y" }}</small></p>
{{ comment.comment }}
</div>
<hr class="soften">
{% endfor %}
</article>

现在刷新页面提交评论是不是正常了呢

下一篇将介绍如何添加markdown代码高亮

最后源代码可以在  https://github.com/goodspeedcheng/sblog 可以看一下 希望大家把错误的地方提出纠正一下。

                                                                                                                                                       谢谢

扩展阅读: https://docs.djangoproject.com/en/1.4/

参考博客:http://ca.rroll.net/2009/05/10/improving-django-comments-user-experience-with-ajax/

http://newliu.com/post/11/

推荐 Django 最佳实践 - 中文版  https://github.com/brantyoung/zh-django-best-practices/blob/master/readme.rst/

 

 

 

 

django 简易博客开发 1 安装、创建、配置、admin使用

http://www.cnblogs.com/cacique/archive/2012/09/29/2707976.html

django 简易博客开发 2 模板和数据查询

http://www.cnblogs.com/cacique/archive/2012/09/30/2709143.html

django 简易博客开发 3 静态文件、from 应用与自定义

http://www.cnblogs.com/cacique/archive/2012/10/01/2709668.html

django 简易博客开发 4 comments库使用及ajax支持

http://www.cnblogs.com/cacique/archive/2012/10/03/2710803.html

django 简易博客开发 5 markdown支持、代码高亮、gravatar头像服务

http://www.cnblogs.com/cacique/archive/2012/10/07/2713703.html

django 简易博客开发 4 comments库使用及ajax支持的更多相关文章

  1. django 简易博客开发 5 markdown支持、代码高亮、gravatar头像服务

    上一篇博客介绍了comments库使用及ajax支持,现在blog已经具备了基本的功能,但是只能发表文字,不支持富文本编辑.今天我们利用markdown添加富文本支持. markdown语法说明: h ...

  2. django 简易博客开发 3 静态文件、from 应用与自定义

    首先还是贴一下源代码地址  https://github.com/goodspeedcheng/sblog 上一篇博客我们介绍了 django 如何在views中使用templates以及一些常用的数 ...

  3. django 简易博客开发 2 模板和数据查询

    首先还是贴一下项目地址  https://github.com/goodspeedcheng/sblog   因为代码全在上面 上一篇博客我们介绍了 django的安装配置,新建project,新建a ...

  4. django 简易博客开发 1 安装、创建、配置、admin使用

    首先贴一下项目地址吧  https://github.com/goodspeedcheng/sblog 到现在位置项目实现的功能有: 1.后台管理使用Admin ,前端显示使用bootstrap 2. ...

  5. django 简易博客开发 1 安装、创建、配置、admin使用(转)

    Django 自称是“最适合开发有限期的完美WEB框架”.本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明,如果你是第一次接触D ...

  6. Django个人博客开发 | 前言

    本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...

  7. 简易博客开发(8)----django1.9 博客部署到pythonanywhere上

    准备工作 首先需要注册一下,pythonanywhere的免费账户有一定的限制,只能创建一个web app,不能绑定独立域名,不能通过ssh连接,不过只是搭一个project也是够用了. 注册成功之后 ...

  8. Django练习——博客系统小试

    在上一篇博客Todolist的基础上(http://blog.csdn.net/hcx25909/article/details/24251427),本周继续进行实践,这次我要搭建一个简单的博客系统. ...

  9. Django搭建简易博客

    Django简易博客,主要实现了以下功能 连接数据库 创建超级用户与后台管理 利用django-admin-bootstrap美化界面 template,view与动态URL 多说评论功能 Markd ...

随机推荐

  1. Python——集合与字典练习

    集合与字典练习question1问题描述:有一个列表,其中包括 10 个元素,例如这个列表是[1,2,3,4,5,6,7,8,9,0],要求将列表中的每个元素一次向前移动一个位置,第一个元素到列表的最 ...

  2. 阿里云人脸比对API封装

    这是根据封装是根据阿里云官方给的Demo进行修改的,当时是因为编写微信小程序云函数需要使用到阿里云人脸比对接口,才对其进行封装的. 记录下来,方便下次使用. 复制下来可以直接使用. 用到的依赖如下: ...

  3. 888. Fair Candy Swap@python

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...

  4. (6) openssl passwd(生成加密的密码)

    该伪命令用于生成加密的密码 [root@docker121 ssl]# man -f passwd passwd (1) - update user's authentication tokens p ...

  5. c++_最大公共子串

    标题:最大公共子串 最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc",可以找 ...

  6. Spring Boot 返回Html界面

    @Controller public class HelloController { @RequestMapping("/") public String index(){ ret ...

  7. 【HIHOCODER 1478】 水陆距离(BFS)

    描述 给定一个N x M的01矩阵,其中1表示陆地,0表示水域.对于每一个位置,求出它距离最近的水域的距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. 输入 第一行包含两个整数,N和M. ...

  8. Leetcode 283.移动零

    移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组 ...

  9. tarjan求割边割点

    tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的 ...

  10. 71.mybatis 如何获取插入的id【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 在之前的文章已经讲过spring boot集成mybatis了,但是忘记说一个很重要的知识点了,那就是获取获取主键id,这篇文章补充下,sprin ...