生成文章摘要的两种方式

     文章摘要可以是自己填写的,也可以是通过正文生成的。简单点就是截取正文前面一段,比如100字。本文考虑的是富文本情况下的截取正文前面200字,非富文本的文章截取直接切片就行,而对于富文本,因为有HTML标签,会比较麻烦。所以本文的标题可以改为:去除html标签的两种方法。思路是:先去掉所有的HTML标签,再截取。在写下面的方法之前,在网上看到一些通过前端js代码来实现的方法,但是发现结果很如人意,可能是因为我js还有很大提升空间的原因。下面都是在后台去掉HTML代码,然后截取的方法。

1.re去掉html标签(开始我是通过写的自定义标签的方式来实现在,在前端可以自定义要截取多少字,默认200)

import re
from django import template

register = template.Library()


@register.filter
def get_abstract(html, length=200):
    pattern = re.compile('<[^>]+>')
    text = re.sub(pattern,'',html)
    text = text.replace('\n','')
    text = text.replace('&nbsp;','')

    if len(text) > length:
        text = text[:length]
    else:
        text = text
    return text

2.利用Django内置方法strip_tags

models.py中的Article中添加get_abstract()方法。这里其实可以将这个生成的abstract存储到数据库,不过我觉得没必要,并没有存储。

from django.utils.html import strip_tags

class Article(models.Model):
    ...
    def get_abstract(self,length=200):
        abstract = strip_tags(self.content)
        abstract = abstract.replace('\n','').replace('&nbsp;','')
        abstract = abstract[:200]
        return abstract

可以看到django 内置方法很方便,只需要调用strip_tags()方法即可。上面只是原理,如果需要保存到数据库则需要重写save方法,在save之前处理完,最后保存即可。

两种方法都可以用,不过建议逻辑尽量放在model中,所以没必要另建一个标签文件。

上一篇:Django 渲染form 表单的一个错误

下一篇:Edge无法打开本地地址:127.0.0.1