Django學習筆記—Comments庫的使用方法小記

鴨脖發表於2012-05-06

comments庫是django框架內建的一個評論庫,官方文件地址:https://docs.djangoproject.com/en/dev/ref/contrib/comments/可以快捷的搭建出網站需要的評論系統。不過對這個庫的評價似乎褒貶不一,我自己在使用中的感受是要想讓這個庫能夠比較完美的工作,可能自己需要做較多的定製工作,有時想想,還真不如自己重頭寫來的爽氣。這裡照例把自己的一些使用經驗記錄一下,以供參考。

一、啟用步驟

  1. 新增APP:INSTALLED_APPS=(‘django.contrib.comments’,)
  2. 更新資料庫。執行命令:python manage.py syncdb 
  3. 新增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庫將會使用內建的模板檔案自動為你生成一個評論表單,該表單包含的欄位將包括:

  1. csrfmiddlewaretoken——django csrf中介軟體需要
  2. content_type——
  3. content_pk——ID值
  4. timestamp——當前時間
  5. security_hash——安全檢測用
  6. name——名稱
  7. email——郵箱
  8. comment——內容
  9. 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即可),重寫你自己的提醒內容,加上自己設計的樣式。

要轉載本文,請註明原文地址: http://newliu.com/post/11/

相關文章