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
分享到:
相关推荐
### Django 自定义过滤器的实现 #### 一、概述 在使用Django开发Web应用时,我们经常会遇到需要对模版中的数据进行处理的情况。Django自带了一套强大的模板语言——Django Template Language (DTL),它允许开发者...
在Django框架中,自定义过滤器是一个强大的特性,它允许开发者扩展模板语言的功能,以处理特定的逻辑操作。过滤器本质上是Python函数,它们接收一个值作为输入,然后对其进行处理,返回一个新的值。在本文中,我们将...
本文将详细解释如何在Django中创建一个自定义过滤器,以及如何通过一个具体例子来判断某个变量是否存在于列表之中。 首先,了解Django过滤器的基本概念是必要的。Django的模板系统提供了自定义过滤器的功能,允许...
自定义过滤器。 自定义的过滤器函数,至少有一个参数,最多两个 例如: {{ book.btitle|length }} # 返回字符串或列表的长度 {{ book.bpub_date|date:'Y年-m月-d日' }} # 格式化日期格式 {{ content|default:'hello...
在Django框架中,自定义过滤器是扩展模板语言功能的重要手段,尤其在处理复杂变量时显得尤为关键。本篇文章将详细讲解如何在Django中创建并使用自定义过滤器来处理字典嵌套以及对象属性的访问。 首先,我们来看一下...
下面将详细介绍一些常见的Django过滤器以及如何创建自定义过滤器。 1. `upper`:将字符串转换为大写,如`{{ user.name | upper }}`将输出用户名的大写形式。 2. `add`:给变量加上指定的数值,例如`{{ user.age | ...
要创建自定义过滤器,你需要遵循以下步骤: 1. 在你的Django应用中创建一个名为`templatetags`的目录,如果不存在的话。 2. 在`templatetags`目录中创建一个Python文件,例如`my_filters_and_tags.py`。 3. 在该...
本文实例讲述了Django自定义过滤器定义与用法。分享给大家供大家参考,具体如下: 一、自定义过滤器的介绍 前面我们就介绍过过滤器其实就是一个函数,把要过来的字段传递到一个函数内,进行加工处理,返回一个新的值...
在模板中使用自定义过滤器的方式与内置过滤器类似,只需将过滤器名称放在管道符号 (`|`) 后面即可。 ```html {{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }} ``` #### 四...
2. **自定义管理器**:可以定义自定义的管理器类,通过设置`admin.ModelAdmin`的属性(如list_display、list_filter、search_fields等)来自定义后台界面的显示和过滤方式。 3. **权限管理**:Django的权限系统允许...
可以创建自定义的过滤器或者重写`get_search_results`方法来实现多条件组合搜索。 4. **数据显示**:BootstrapTable是一种流行的数据展示方式,它提供了分页、排序、筛选等功能,能很好地适应前后端分离的架构。在...
Autoforms是Jeff开源的一个基于Django的自定义表单引擎,可用于调查、投票、信息收集甚至是整合至工作流程引擎和PAAS平台当中。 AutoForms的主要特性: 支持14种字段类型13种html输入控件(包括日期选择组件)...
在Django 1.8版本中,它包含了一系列的内置过滤器,这些过滤器可以帮助开发人员在展示数据时,对数据进行各种处理,比如数学计算、字符串操作等。 文档内容涵盖了多个内置过滤器的功能和用法。例如,`widthratio`...
django中自定义了一些singals,用于监听一些操作,并发出通知 官方解释: Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。 简单来说,信号允许特定的sender通知一组receiver...
django+python自定义分页插件,简单易用,只需要三行代码即可展示自定义分页,支持多个展示效果