[django]使用内置的 comments 实现评论功能

安装 comments 应用

  1. 编辑 settings 文件,INSTALLED_APPS 项添加 'django.contrib.comments',

    INSTALLED_APPS = (
        # ...
        'django.contrib.comments',
        # ...
    )
    
  2. 执行 python manage.py syncdb 创建评论表。

  3. 编辑 urls.py 文件,添加评论相关的 url:
    urlpatterns = patterns('',
        # ...
        url(r'^comments/', include('django.contrib.comments.urls')),
        # ...
    )
    

示例 views

def display_topic(request, topic_id):
    topic = Topic.objects.get(id=topic_id)
    return render_to_response('topic.html', {'topic': topic},
                              RequestContext(request))

基本使用

首先要导入 comments 模板标签:

{% load comments %}

模板标签的使用(基于上面的 views):

获取评论数

获取 topic 对象的评论数:

{% get_comment_count for topic as comment_count %}
<p>Comments({{ comment_count }}):</p>

显示评论:

  • 使用默认的显示方式:

    {% render_comment_list for topic %}
    

    效果:

    django-comments-01

  • 自定义显示:

    {% get_comment_list for topic as comment_list %}
    {% for comment in comment_list %}
      <p>Posted by: {{ comment.user_name }} on {{ comment.submit_date }}</p>
      <p>{{ comment.comment }}</p>
    {% endfor %}
    

    效果:

    django-comments-01

评论链接

要使用自带的评论链接功能需要在 models 中定义 get_absolute_url 方法(请参考 get_absolute_url):

urls.py:

url(r'^topic/(?P<topic_id>\d+)/$', 'hello.views.display_topic',
    name="display_topic"),

models.py:

class Topic(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()

    @models.permalink
    def get_absolute_url(self):
        return ('display_topic', (), {'topic_id': self.id})

模板中显示评论链接:

{% for comment in comment_list %}

  <p>
  {# 显示评论链接 #}
  <a name="c{{ comment.id }}"></a>
  <a href="{% get_comment_permalink comment %}">
      #{{ forloop.counter }}
  </a>
  {# end #}

  Posted by: {{ comment.user_name }} on {{ comment.submit_date }}</p>
  <p>{{ comment.comment }}</p>
{% endfor %}

效果:

django-comments-permalink

用于发表评论的表单

默认显示方式:

{% get_comment_form for topic as form %}
<form action="{% comment_form_target %}" method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <input type="submit" value="Comment" />
</form>

效果:

django-comments-form-01

comments form 包含如下字段:

  • name ——名称
  • email ——邮箱
  • url ——网址
  • comment ——内容
  • honeypot ——防止机器乱填垃圾信息
  • content_type ——与后台有关,可以去后台 Comments 应用中看看
  • object_pk ——对应的帖子 id
  • timestamp ——时间戳
  • security_hash ——用于安全检测

自定义显示

由于默认生成的表单一般让人不太满意,所以就需要通过自定义来调整一下:

{% get_comment_form for topic as form %}
<form action="{% comment_form_target %}" method="post">
  {% csrf_token %}

  <p><label for="id_name">Name: </label>{{ form.name }}</p>
  <p><label for="id_email">E-mail: </label>{{ form.email }}</p>
  <p><label for="id_url">Web Site: </label>{{ form.url }}</p>
  <p><label for="id_comment">Comment: </label>{{ form.comment }}</p>
  {{ form.content_type }}
  {{ form.object_pk }}
  {{ form.timestamp }}
  {{ form.security_hash }}
  <span style="display: none;">{{ form.honeypot }}</span>

  <input type="submit" value="Comment" />
</form>

效果:

django-comments-form-02

评论发表成功后跳转回当前页面

只需在 form 中包含字段 "next" 即可:

<input type="hidden" name="next" value="/topic/{{ topic.id }}"/>
<input type="submit" value="Comment" />

基于 django 1.4.3 的示例项目:仓库 && 下载

参考

有任何意见欢迎在下方留言或者加我微信交流


Comments

comments powered by Disqus