您现在的位置是: 网站首页 >Django Django

基于mptt库实现多级评论及回复

admin2018年11月18日 20:57 Django | Html | JavaScript | JQuery 1316人已围观

# 基于mptt多级评论回复【新版】 ## 评论模型设计和显示文章的评论视图 设计模型 ```python from django.db import models from django.utils.timezone import now from mptt.models import MPTTModel, TreeForeignKey # 博客评论 class BlogComment(MPTTModel): is_anonymous = models.BooleanField(default=False, verbose_name='是否匿名') # 已登录用户 created_user = models.ForeignKey(UserProfile, blank=True, null=True, on_delete=models.SET_NULL, verbose_name='评论人') # 匿名评论 nick_name = models.CharField(blank=True, default='', max_length=30, verbose_name='匿名昵称') email = models.EmailField(blank=True, null=True, default=None, verbose_name='匿名邮箱') parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children', verbose_name='父标题') blog = models.ForeignKey(Article, on_delete=models.CASCADE, related_name="comments", verbose_name='博客') content = models.TextField(verbose_name='评论内容') created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') is_showed = models.BooleanField(default=False, verbose_name='是否显示') class MPTTMeta: order_insertion_by = ['-created_time', 'blog'] # 按照时间插入,新加的直接放在前面 class Meta: verbose_name = '博客评论' # 后台显示模型名称 verbose_name_plural = verbose_name def __str__(self): if self.is_anonymous: # 如果是匿名 if self.parent: return "{} 回复 {}:{}".format(self.nick_name, self.parent.content, self.content) else: return "{} 对 {} 评论:{}".format(self.nick_name, self.blog.title, self.content) else: if self.parent: return "{} 回复 {}:{}".format(self.created_user.username, self.parent.content, self.content) else: return "{} 对 {} 评论:{}".format(self.created_user.username, self.blog.title, self.content) ``` 评论展示,视图中只显示一级评论 ```python # 该内容的回复 # all_article_comment = article.comments.all() all_article_comment = article.comments.filter(parent=None, is_showed=True) # print(all_article_comment) ``` ## 文章评论及回复展示-模板遍历 ### mptt模板中的递归 这个需要视图中获取所有该文章的评论`all_article_comment = article.comments.all()` ```html <!--使用默认的递归显示--> <ol id="comment_list" class="commentlist"> {% recursetree all_article_comment %} <li> <div {% if not node.is_root_node %}class="sub_comment_content" {% endif %}> <span class="comment-f">{{ node.get_descendant_count }}#</span> <div class="comment-main"> <p> {% if node.is_anonymous %} <img class="img-circle" src="/media/usercenter/default.png" alt="" style="max-width: 30px"> <a class="address" rel="nofollow"> {% if node.parent %} {{ node.nick_name }}(匿名)@ {% if node.parent.is_anonymous %} {{ node.parent.nick_name }}(匿名) {% else %} {{ node.parent.created_user.get_user_display }} {% endif %} {% else %} {{ node.nick_name }}(匿名) {% endif %} </a> {% else %} <img class="img-circle" src="{{ node.created_user.image.url }}" alt="" style="max-width: 30px"> <a class="address" rel="nofollow"> {% if node.parent %} {{ node.created_user.get_user_display }}@ {% if node.parent.is_anonymous %} {{ node.parent.nick_name }}(匿名) {% else %} {{ node.parent.created_user.get_user_display }} {% endif %} {% else %} {{ node.created_user.get_user_display }} {% endif %} </a> {% endif %} <span class="time">({{ node.created_time }})</span> </p> <p style="margin-left: 30px" data-toggle="tooltip" data-placement="top" data-original-title="{{ node.parent.content }}"> {% if node.is_showed %}{{ node.content }}{% else %}该条评论正在审核中···{% endif %} </p> </div> </div> {% if not node.is_leaf_node %} {{ children }} {% endif %} </li> {% endrecursetree %} </ol> ``` ### 自定义遍历评论展示 ```html <div id="postcomments"> <ol id="comment_list" class="commentlist"> {# for comment in article.comments.all reversed #} {% for comment in all_article_comment %} <li class="comment-content" style="border-bottom:none"> <span class="comment-f">{{ forloop.revcounter }}楼</span> <div class="comment-main"> {% if comment.is_anonymous %} <img class="img-circle" src="/media/usercenter/default.png" alt="" style="max-width: 30px"> <a class="address" rel="nofollow"> {{ comment.nick_name }}(匿名) </a> {% else %} <img class="img-circle" src="{{ comment.created_user.image.url }}" alt="" style="max-width: 30px"> <a class="address" rel="nofollow"> {{ comment.created_user.get_user_display }} </a> {% endif %} <span class="time">({{ comment.created_time }})</span> <p style="margin-left: 30px">{{ comment.content }}</p> </div> </li> {% if comment.children.all %} <div class="sub_comment_content"> {% for comment in comment.get_descendants %} <li class="comment-content"> <span class="comment-f">{{ forloop.revcounter }}#</span> <div class="comment-main" data-toggle="tooltip" data-placement="top" data-original-title="回复:{{ comment.parent.content }}"> {% if comment.is_anonymous %} <img class="img-circle" src="/media/usercenter/default.png" alt="" style="max-width: 30px"> <a class="address" rel="nofollow"> {% if comment.parent %} {{ comment.nick_name }}(匿名)@ {% if comment.parent.is_anonymous %} {{ comment.parent.nick_name }}(匿名) {% else %} {{ comment.parent.created_user.get_user_display }} {% endif %} {% else %} {{ comment.nick_name }}(匿名) {% endif %} </a> {% else %} <img class="img-circle" src="{{ comment.created_user.image.url }}" alt="" style="max-width: 30px"> <a class="address" rel="nofollow"> {% if comment.parent %} {{ comment.created_user.get_user_display }}@ {% if comment.parent.is_anonymous %} {{ comment.parent.nick_name }}(匿名) {% else %} {{ comment.parent.created_user.get_user_display }} {% endif %} {% else %} {{ comment.created_user.get_user_display }} {% endif %} </a> {% endif %} <span class="time">({{ comment.created_time }})</span> <p style="margin-left: 30px"> {% if comment.is_showed %}{{ comment.content }}{% else %}该条评论正在审核中···{% endif %} </p> </div> </li> {% endfor %} </div> {% endif %} {% endfor %} </ol> </div> ``` ![BLOG_20181202_193714_90](/media/blog/images/2018/12/BLOG_20181202_193714_90.png "博客图集BLOG_20181202_193714_90.png")

很赞哦! (2)

文章交流

  • emoji
7人参与,2条评论
月下金狐 2018年11月18日 21:00
我用python
吾星喵 @ 月下金狐 2018年11月18日 21:02
最终登上人生巅峰~
吾星喵 @ 月下金狐 2018年11月18日 21:01
从入门到决不放弃!
User @ 吾星喵 2018年11月18日 21:04
快来加入我们吧
吾星喵 @ User 2018年11月18日 21:04
StarMeow
起意 @ 吾星喵 2018年11月18日 21:07
666
吾星喵 2018年11月18日 20:59
人生苦短

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行2074天
  • 系统信息:Linux
  • 后台程序:Python: 3.8.10
  • 网站框架:Django: 3.2.6
  • 文章统计:256 篇
  • 文章评论:60 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 公众号:微信扫描二维码,关注我们
  • QQ群:QQ加群,下载网站的学习源码
返回
顶部
标题 换行 登录
网站