comments库是django框架内置的一个评论库,见官方文档,可以快捷的搭建出网站需要的评论系统。不过对这个库的评价似乎褒贬不一,我自己在使用中的感受是要想让这个库能够比较完美的工作,可能自己需要做较多的定制工作,有时想想,还真不如自己重头写来的爽气。这里照例把自己的一些使用经验记录一下,以供参考。
一、激活步骤
- 添加APP:INSTALLED_APPS=(‘django.contrib.comments’,)
- 更新数据库。执行命令:python manage.py syncdb
- 添加url。在urls.py中添加:(r’^comments/’, include(‘django.contrib.comments.urls’)),
二、如何在admin后台显示comments详情页面
将settings.py中的INSTALLED_APPS中的django.contrib.sites取消注释即可。
三、如何在模板中使用comments
在模板文件中加载comments这个模板标签:
1
|
{
%
load comments
%
}
|
四、如何在模板中显示评论
使用示例如下:
1
2
3
4
|
{
%
get_comment_list
for
[
object
] as [comment_list]
%
}
{
%
for
comment
in
comment_list
%
}
<p>on {{comment.submit_date|date:”F,j,Y”}}, {{comment.user_name}} said: {{comment.comment|safe}}<
/
p>
{
%
endfor
%
}
|
五、给用户显示一个添加评论的表单
可以简单的使用内置的评论表单模板,示例如下:
1
2
3
4
|
<div
id
=
’commentform’>
<h2>发表你的评论<
/
h2>
{
%
render_comment_form
for
[
object
]
%
}
<
/
div>
|
只需要这个模板标签,就将comments系统与你的项目集成了。comments库将会使用内置的模板文件自动为你生成一个评论表单,该表单包含的字段将包括:
- csrfmiddlewaretoken——django csrf中间件需要
- content_type——
- content_pk——ID值
- timestamp——当前时间
- security_hash——安全检测用
- name——名称
- email——邮箱
- comment——内容
- honeypot——防止机器乱填垃圾信息
六、自定义评论表单
很遗憾的说,comments库自带的表单实在太丑了,而且我们总得对表单做一些自定义,使其符合我们的需求。故我们可以将整个评论表单自定义一下,只要在模板文件中使用get_comment_form这个模板标签即可获取一个可在模板中使用的表单对象。一个较为完整的示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{%get_comment_form for post as form%}
<
form
action
=
'{%comment_form_target%}'
method
=
'post'
>
{% csrf_token %}
{{form.object_pk}}
{{form.content_type}}
{{form.timestamp}}
{{form.security_hash}}
<
p
><
label
for
=
"id_name"
>姓名(必填):</
label
><
input
name
=
"name"
id
=
"id_name"
></
p
>
<
p
><
label
for
=
"id_email"
>邮箱(必填):</
label
><
input
name
=
"email"
id
=
"id_email"
></
p
>
<
p
><
label
for
=
"id_url"
>网站(可选):</
label
><
input
name
=
"url"
id
=
"id_url"
></
p
>
<
p
><
label
for
=
"id_comment"
>评论(必填):</
label
></
p
>
<
p
><
textarea
id
=
"id_comment"
rows
=
"10"
cols
=
"40"
name
=
"comment"
></
textarea
></
p
>
<
p
style
=
"display:none;"
><
label
for
=
"id_honeypot"
>如果你在该字段中输入任何内容,那么你的评论就会被视为垃圾评论。</
label
> <
input
type
=
"text"
name
=
"honeypot"
id
=
"id_honeypot"
></
p
>
<
p
><
input
name
=
"post"
value
=
"发表"
type
=
"submit"
/></
p
>
<
input
type
=
'hidden'
name
=
'next'
value
=
'{%url post_by_id post.id%}'
/>
</
form
>
|
可为其加上如下的CSS样式
1
2
3
4
5
6
|
<style type=
"text/css"
>
label{
display
:
inline
;
float
:
left
;
width
:
100px
;}
input,textarea{
width
:
340px
;}
textarea{
height
:
80px
;}
input[type=submit]{
width
:
120px
;
margin-left
:
300px
;}
</style>
|
关于示例中代码的一些解释:
1.用于生成评论提交地址。
1
|
<
form
action
=
'{%comment_form_target%}'
method
=
'post'
>
|
2.用于评论提交后的重定向。
1
|
<
input
type=”hidden” name=”next” value=”{%url my_comment_was_posted%}”/>
|
3.自定义表单时,一定要加上{% csrf_token %}这句。另外四个模板变量则是调用form.属性来生成那些隐藏的字段的值或名称,因为我们看到当使用默认表单的时候,comments会自动帮我们把9个字段全部收成好,故当我们自定义表单时也需要补全所有字段,不然会提交失败。
1
2
3
4
5
|
{% csrf_token %}
{{form.object_pk}}
{{form.content_type}}
{{form.timestamp}}
{{form.security_hash}}
|
4.关于honeypot字段的说明。
这个字段是用于防止机器程序发布垃圾信息的。文档里的说法是:一般机器程序发布垃圾信息时,会把表单里的所有字段都填上,而这个字段一旦被填上则此信息将被判为spam,简单说这个字段是用来戏耍机器程序的,我不知道究竟有没有效实际效果。
七、若需要登录才能显示发布评论的表单
示例如下:
1
2
3
4
5
6
|
{%if user.is_authenticated%}
<
h2
>发表你的评论</
h2
>
{%render_comment_form for object%}
{%else%}
请<
a
href=”/accounts/login”>登录</
a
>,或<
a
href=”/accounts/register”>注册</
a
>后再评论
{%endif%}
|
八、显示评论数量
1
|
{%get_comment_count for [object] as [comment_count]%}
|
九、评论的链接
1
2
3
4
5
|
{%for comment in comment_list%}
<
a
href=”{%get_comment_permalink comment%}”>
permalink for comment #{{forloop.counter}}
</
a
>
{%end for%}
|
十、评论生成后自动发邮件通知网站管理员
给评论系统再增加一个邮件通知系统,我是这样实现的:修改django的comments库的源代码,在python27/lib/site-packages/django/contrib/comments/views/comments.py中添加如下代码:
1
2
3
4
5
6
7
8
9
10
11
|
#coding:utf-8
from
django.core.mail
import
send_mail
from
django.views.decorators.csrf
import
csrf_exempt
if
comment.is_public:
send_mail(
u’博客有新评论’,
u’评论者:\n’
+
comment.user_name
+
u’\n\r评论内容:\n’
+
comment.comment
+
u’\n\r评论者邮箱:\n’
+
comment.user_email,
‘sender@example.com’,
[‘admin@example.com’],
)
|
先判断评论的is_public属性,因为若使用了akismet,则恶意评论的该属性为false,故网站收到恶意评论不会向管理员发送通知邮件。需要注意这个代码块要放在源码当中comment.save()这句的后面,不然得不到正确的is_public属性值。
十一、自定义某些模板
如果评论表单未提交成功,则comments库会自动加载其源码中的comments/preview.html这个默认模板,提醒用户表单项有误。但需要注意的是这个模板会很丑陋,故你可以在自己的项目中复制这个模板(路径要保证是templates/comments/preview.html即可),重写你自己的提醒内容,加上自己设计的样式。