django博客四

评论

博客怎么能少了评论呢?一个好消息是,Django 提供了内置的功能来实现评论。通过典型的应用安装方式,我们将下面代码加在settings.py中,注意要放在INSTALLED_APPS的'django.contrib.admin'之下。

  1. ‘django.contrib.comments’,  
之后我们需要把它映射到我们的posts。简单起见,我们编辑项目的urls.py并在urlpatterns中加上下面代码:

  1. (r’^comments/’, include(‘django.contrib.comments.urls’)),  

现在我们就能向我们的帖子里加评论了。评论应用加上定制模板标签。在模板标签前使用{% load comments %}来加载评论。

列表页

编辑posts/post_list.html:

  1. {% extends ‘base.html’ %}  
  2. {% load comments %}  
  3. {% block content %}  
  4. {% for object in object_list %}  
  5.     <hr/>  
  6.     {% include ‘posts/_post.html’ %}  
  7.     {% get_comment_count for object as comment_count %}  
  8.     <small>{{ comment_count }} comment{{ comment_count|pluralize }}</small>  
  9. {% endfor %}  
  10. {% endblock %}  

我们加载了评论模板标签,并且获得了给定帖子对象的评论数,再将帖子展示出来。你可能注意到了那个pluralize(复数)过滤器。在我们的例子中,这个复数过滤器接收一个数值然后在值不为1的情况下多输出一个s。对于那些复数形式不以s结尾的,会表示成:

  1. fish{{ fish_count|pluralize:”es” }}  
或者
  1. famil{{ family_count|pluralize:”y,ies” }}  
里面的冒号代表了能被过滤器接受的参数。一个过滤器能接受除了左边的输入变量以外至多一个附加参数。

内容页

编辑post_detail.html并在include标签后添加下面代码:

  1. {% get_comment_list for object as comment_list %}  
  2. <h3>Comments</h3>  
  3. {% for comment in comment_list %}  
  4.     <div id=”comment_{{ comment.id }}”>  
  5.         <p>{{ comment.comment }}</p>  
  6.         <small>{{ comment.name }}</small>  
  7.     </div>  
  8. {% empty %}  
  9.     <p>It’s pretty quiet here… be first to comment!</p>  
  10. {% endfor %}  

get_comments_list标签的用处就像它的名字。它把从某个特定模型中获得的评论存储在comment_list中。使用comment_list,就和在post_list.html中使用object_list一样,我们能通过一个循环来遍历所有的评论。你可能还注意到empty模板标签。那就像在一个if语句中的else子句一样。对于一个for循环,如果在列表中没有任何元素,empty块就会被显示。

最后,让我们加上一个评论表单,来提交新的评论。加上以下代码:

  1. <hr/>  
  2. <h3>Your comment</h3>  
  3.   
  4. {% get_comment_form for object as form %}  
  5.   
  6. <form action=”{% comment_form_target %}?next={% url post object.id %}” method=”post”>  
  7.     {{ form.content_type }}  
  8.     {{ form.object_pk }}  
  9.     {{ form.timestamp }}  
  10.     {{ form.security_hash }}  
  11.     <p style=”display:none”><label for=”id_honeypot”>Leave blank</label>{{ form.honeypot }}</p>  
  12.     <p>  
  13.         <label for=”id_name”>Name</label>  
  14.         {{ form.name }}  
  15.     </p>  
  16.     <p>  
  17.         <label for=”id_comment”>Comment</label>  
  18.         {{ form.comment }}  
  19.     </p>  
  20.     <p><input type=”submit” name=”post” value=”Post” /></p>  
  21. </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确实是不错的一个框架,大家值得一试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值