第 11 篇:自动生成文章摘要
作者:HelloGitHub-追梦人物
博客文章的模型有一个 覆写 save 方法第一种方法是通过覆写模型的 回顾一下博客文章模型代码: blog/models.py class Post(models.Model): # 其它字段... body = models.TextField() excerpt = models.CharField(max_length=200,blank=True) def save(self,*args,**kwargs): self.modified_time = timezone.now() super().save(*args,**kwargs) 其中 blog/models.py import markdown from django.utils.html import strip_tags class Post(models.Model): # 其它字段... body = models.TextField() excerpt = models.CharField(max_length=200,blank=True) # 其它方法... def save(self,**kwargs): self.modified_time = timezone.now() # 首先实例化一个 Markdown 类,用于渲染 body 的文本。 # 由于摘要并不需要生成文章目录,所以去掉了目录拓展。 md = markdown.Markdown(extensions=[ 'markdown.extensions.extra','markdown.extensions.codehilite',]) # 先将 Markdown 文本渲染成 HTML 文本 # strip_tags 去掉 HTML 文本的全部 HTML 标签 # 从文本摘取前 54 个字符赋给 excerpt self.excerpt = strip_tags(md.convert(self.body))[:54] super().save(*args,**kwargs) 这里生成摘要的方案是,先将 然后在模板中适当的地方使用模板标签引用 templates/blog/index.html <article class="post post-{{ post.pk }}"> ... <div class="entry-content clearfix"> <p>{{ post.excerpt }}...</p> <div class="read-more cl-effect-14"> <a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav">→</span></a> </div> </div> </article> 新添加一篇文章(这样才能触发 save 方法,此前添加的文章不会自动生成摘要,要手动保存一下触发 save 方法),可以看到摘要效果了。 使用 truncatechars 模板过滤器第二种方法是使用 例如摘要效果,需要显示 templates/blog/index.html <article class="post post-{{ post.pk }}"> ... <div class="entry-content clearfix"> <p>{{ post.body|truncatechars:54 }}</p> <div class="read-more cl-effect-14"> <a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav">→</span></a> </div> </div> </article> 不过这种方法的一个缺点就是如果前 54 个字符含有块级 HTML 元素标签的话(比如一段代码块),会使摘要比较难看。所以推荐使用第一种方法。 欢迎关注 HelloGitHub 公众号,获取更多开源项目的资料和内容 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |