博客怎么能少了评论呢?一个好消息是,Django 提供了内置的功能来实现评论。通过典型的应用安装方式,我们将下面代码加在settings.py中,注意要放在INSTALLED_APPS的'django.contrib.admin'之下。
‘django.contrib.comments’,
之后我们需要把它映射到我们的posts。简单起见,我们编辑项目的urls.py并在urlpatterns中加上下面代码:
(r’^comments/’, include(‘django.contrib.comments.urls’)),
现在我们就能向我们的帖子里加评论了。评论应用加上定制模板标签。在模板标签前使用{% load comments %}来加载评论。
列表页
编辑posts/post_list.html:
{% extends ‘base.html’ %}
{% load comments %}
{% block content %}
{% for object in object_list %}
<hr/>
{% include ‘posts/_post.html’ %}
{% get_comment_count for object as comment_count %}
<small>{{ comment_count }} comment{{ comment_count|pluralize }}</small>
{% endfor %}
{% endblock %}
我们加载了评论模板标签,并且获得了给定帖子对象的评论数,再将帖子展示出来。你可能注意到了那个pluralize(复数)过滤器。在我们的例子中,这个复数过滤器接收一个数值然后在值不为1的情况下多输出一个s。对于那些复数形式不以s结尾的,会表示成:
fish{{ fish_count|pluralize:”es” }}
或者
famil{{ family_count|pluralize:”y,ies” }}
里面的冒号代表了能被过滤器接受的参数。一个过滤器能接受除了左边的输入变量以外至多一个附加参数。
内容页
编辑post_detail.html并在include标签后添加下面代码:
{% get_comment_list for object as comment_list %}
<h3>Comments</h3>
{% for comment in comment_list %}
<div id=”comment_{{ comment.id }}”>
<p>{{ comment.comment }}</p>
<small>{{ comment.name }}</small>
</div>
{% empty %}
<p>It’s pretty quiet here… be first to comment!</p>
{% endfor %}
get_comments_list标签的用处就像它的名字。它把从某个特定模型中获得的评论存储在comment_list中。使用comment_list,就和在post_list.html中使用object_list一样,我们能通过一个循环来遍历所有的评论。你可能还注意到empty模板标签。那就像在一个if语句中的else子句一样。对于一个for循环,如果在列表中没有任何元素,empty块就会被显示。
最后,让我们加上一个评论表单,来提交新的评论。加上以下代码:
<hr/>
<h3>Your comment</h3>
{% get_comment_form for object as form %}
<form action=”{% comment_form_target %}?next={% url post object.id %}” method=”post”>
{{ form.content_type }}
{{ form.object_pk }}
{{ form.timestamp }}
{{ form.security_hash }}
<p style=”display:none”><label for=”id_honeypot”>Leave blank</label>{{ form.honeypot }}</p>
<p>
<label for=”id_name”>Name</label>
{{ form.name }}
</p>
<p>
<label for=”id_comment”>Comment</label>
{{ form.comment }}
</p>
<p><input type=”submit” name=”post” value=”Post” /></p>
</form>
就像你看到的一样,评论表单还提供了一个get_comment_form模板标签。它的作用是从一个模型对象返回一个对象表单来帮我们展示表单。由于我们在html编写上很粗糙,我们只能输出一个生成输入表单的字段。首先的4个字段是:content_type,object_pk, timestamp,security_hash,它们是用来生成评论的隐藏字段。
content_type 是一个特殊的Django属性,它能将一个模型与其他任何模型关联起来。Content types通常是一个指向其他模型的外键,它对于建立一个模型来说非常方便。使用content type,标签或者目录能作为一个独立的应用简单的实现,而不用扩大我们的post应用。但这些属性超出了这个应用的范围。
object_pk是一个特定对象的与时间标示相关联的主键(就是post的id),它是自解释的。评论框架使用security_hash来检测一些欺诈信息。honeypot字段也很相似,把它填上会自动保护评论表单。但这些输入字段都是text类型的,因此我们需要通过CSS来隐藏它们。
接下来的2个字段是给用户输入的常规字段。当然你还可以自己加上email与url或者其他的,但我们的评论做的很简单,只需要输入姓名和评论。
这样,大致就成型了。效果如下:
总结:第一次这么做翻译,很清楚自己翻的很烂。建议去看原文吧。
之后可能还会在多看看官方文档。总的来说Django确实是不错的一个框架,大家值得一试。