comments庫是django框架內建的一個評論庫,官方文件地址:https://docs.djangoproject.com/en/dev/ref/contrib/comments/可以快捷的搭建出網站需要的評論系統。不過對這個庫的評價似乎褒貶不一,我自己在使用中的感受是要想讓這個庫能夠比較完美的工作,可能自己需要做較多的定製工作,有時想想,還真不如自己重頭寫來的爽氣。這裡照例把自己的一些使用經驗記錄一下,以供參考。
一、啟用步驟
- 新增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即可),重寫你自己的提醒內容,加上自己設計的樣式。