`
三月沙
  • 浏览: 620130 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

django 自定义截取中文的过滤器

 
阅读更多

django 自带的模板过滤器truncatewords和truncatewords_html 都是不支持中文的,前者是截取不带html标签的内容,后者截取带html标签的内容。为了达到截取中文的目的,按照truncatewords和思路重新编写了字符截取工具

 

这个新的truncatewords函数是从带html标签的内容或不带html内容中截取字符的,中英文皆可,截取之后会去掉原有的标签,只保留内容

 

 

##################################################################################
#截取字符工具,不保留html
##################################################################################
def truncatewords(s,num,end_text='...'):

    re_tag= re.compile(r'<(/)?([^ ]+?)(?: (/)| .*?)?>')
    re_words = re.compile(u'(&.*?;)|[\u4e00-\u9fa5]{1}|[^\u4e00-\u9fa5]{1}',re.UNICODE)
    
    s = force_unicode(s)

    length=int(num)

    if length<=0:
        return u''
    
    pos = 0
    words=0
    data=[]
    out=''
    current_word = ''
    while words <= length:
    	if words==length:
    		break

        #查找第一个标签结束的>
        m= re_tag.search(s,pos)
        if not m:
            break
        pos = m.end()

        #开始从这个位置向后搜索字符,匹配到第一个字符,停止,检查,如果字符是<,说明匹配到了html标签了,则跳出去,否则开始检查下一个标签的>
        while words <= length:
            if words==length:
                break
            m = re_words.search(s,pos)   
            if not m:
                break
            current_word = m.group()
            if current_word=='<':
                break
            else:
                if not m.group(1):
                    words+=1
                    data.append(str(m.group()))
                    pos+=1
                else:
                    words+=1
                    data.append(str(m.group()))
                    pos=m.end()

    out = ''.join(data)

    out+=end_text
    return out

 

truncatewords_html 也是截取内容,但其保留了html标签

 

 

##################################################################################
#截取字符工具,保留html
##################################################################################
def truncatewords_html(s,num,end_text='...'):
    
    html4_singlets = ('br', 'col', 'link', 'base', 'img', 'param', 'area', 'hr', 'input')
    re_tag= re.compile(r'<(/)?([^ ]+?)(?: (/)| .*?)?>')
    re_words = re.compile(u'(&.*?;)|[\u4e00-\u9fa5]{1}|[^\u4e00-\u9fa5]{1}',re.UNICODE)
    
    s = force_unicode(s)
    
    
    length=int(num)
    
    if length<=0:
        return u''
    
    pos = 0
    words=0
    current_word = ''
    open_tags=[]
    while words <= length:
        if words==length:
            break

        #查找第一个标签结束的>
        m= re_tag.search(s,pos)
        if not m:
            break
        pos = m.end()
        closing_tag,tagname,self_closing=m.groups()
        
        #自关闭标签不处理,或者是单标签
        if self_closing or tagname in html4_singlets:
            pass
        elif closing_tag:
            # Check for match in open tags list
            try:
                i = open_tags.index(tagname)
            except ValueError:
                pass
            else:
                #移除该标签,说明该标签已经闭合
                open_tags.remove(tagname)
        else:
            #把标签加入到仍然打开的标签中
            open_tags.insert(0, tagname)
            
        #开始从这个位置向后搜索字符,匹配到第一个字符,停止,检查,如果字符是<则跳出去,否则开始检查下一个标签的>
        while words <= length:
            
            if words==length:
                break
            m = re_words.search(s,pos)
            if not m:
                break
            current_word = m.group()
            if current_word=='<':
                break
            else:
                if not m.group(1):
                    words+=1
                    pos+=1
                else:
                    words+=1
                    pos=m.end()
    #如果本身的大小就不够,则不加结尾
    if pos==len(s):
    	return s
    out = s[:pos]
    if end_text:
        out += ' ' + end_text
    # Close any tags still open
    for tag in open_tags:
        out += '</%s>' % tag

    # Return string
    return out
0
12
分享到:
评论

相关推荐

    django 自定义过滤器的实现

    ### Django 自定义过滤器的实现 #### 一、概述 在使用Django开发Web应用时,我们经常会遇到需要对模版中的数据进行处理的情况。Django自带了一套强大的模板语言——Django Template Language (DTL),它允许开发者...

    深入理解Django的自定义过滤器

    在Django框架中,自定义过滤器是一个强大的特性,它允许开发者扩展模板语言的功能,以处理特定的逻辑操作。过滤器本质上是Python函数,它们接收一个值作为输入,然后对其进行处理,返回一个新的值。在本文中,我们将...

    django 自定义filter 判断if var in list的例子

    本文将详细解释如何在Django中创建一个自定义过滤器,以及如何通过一个具体例子来判断某个变量是否存在于列表之中。 首先,了解Django过滤器的基本概念是必要的。Django的模板系统提供了自定义过滤器的功能,允许...

    Python Django模板之模板过滤器与自定义模板过滤器示例

    自定义过滤器。 自定义的过滤器函数,至少有一个参数,最多两个 例如: {{ book.btitle|length }} # 返回字符串或列表的长度 {{ book.bpub_date|date:'Y年-m月-d日' }} # 格式化日期格式 {{ content|default:'hello...

    django 自定义过滤器(filter)处理较为复杂的变量方法

    在Django框架中,自定义过滤器是扩展模板语言功能的重要手段,尤其在处理复杂变量时显得尤为关键。本篇文章将详细讲解如何在Django中创建并使用自定义过滤器来处理字典嵌套以及对象属性的访问。 首先,我们来看一下...

    Django 过滤器汇总及自定义过滤器使用详解

    下面将详细介绍一些常见的Django过滤器以及如何创建自定义过滤器。 1. `upper`:将字符串转换为大写,如`{{ user.name | upper }}`将输出用户名的大写形式。 2. `add`:给变量加上指定的数值,例如`{{ user.age | ...

    Django自定义模板过滤器和标签的实现方法

    要创建自定义过滤器,你需要遵循以下步骤: 1. 在你的Django应用中创建一个名为`templatetags`的目录,如果不存在的话。 2. 在`templatetags`目录中创建一个Python文件,例如`my_filters_and_tags.py`。 3. 在该...

    Django自定义过滤器定义与用法示例

    本文实例讲述了Django自定义过滤器定义与用法。分享给大家供大家参考,具体如下: 一、自定义过滤器的介绍 前面我们就介绍过过滤器其实就是一个函数,把要过来的字段传递到一个函数内,进行加工处理,返回一个新的值...

    详解django中自定义标签和过滤器

    在模板中使用自定义过滤器的方式与内置过滤器类似,只需将过滤器名称放在管道符号 (`|`) 后面即可。 ```html {{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }} ``` #### 四...

    django 自定义管理系统

    2. **自定义管理器**:可以定义自定义的管理器类,通过设置`admin.ModelAdmin`的属性(如list_display、list_filter、search_fields等)来自定义后台界面的显示和过滤方式。 3. **权限管理**:Django的权限系统允许...

    Django后台输入框联想、自定义页面、搜索框等

    可以创建自定义的过滤器或者重写`get_search_results`方法来实现多条件组合搜索。 4. **数据显示**:BootstrapTable是一种流行的数据展示方式,它提供了分页、排序、筛选等功能,能很好地适应前后端分离的架构。在...

    Django自定义表单引擎Autoforms.zip

    Autoforms是Jeff开源的一个基于Django的自定义表单引擎,可用于调查、投票、信息收集甚至是整合至工作流程引擎和PAAS平台当中。 AutoForms的主要特性: 支持14种字段类型13种html输入控件(包括日期选择组件)...

    Django内置过滤器帮助文档.pdf

    在Django 1.8版本中,它包含了一系列的内置过滤器,这些过滤器可以帮助开发人员在展示数据时,对数据进行各种处理,比如数学计算、字符串操作等。 文档内容涵盖了多个内置过滤器的功能和用法。例如,`widthratio`...

    深入理解Django自定义信号(signals)

    django中自定义了一些singals,用于监听一些操作,并发出通知 官方解释: Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。 简单来说,信号允许特定的sender通知一组receiver...

    django自定义分页插件,bootstrap+python+django分页插件

    django+python自定义分页插件,简单易用,只需要三行代码即可展示自定义分页,支持多个展示效果

Global site tag (gtag.js) - Google Analytics