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自定义过滤器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
自定义过滤器。 自定义的过滤器函数,至少有一个参数,最多两个 例如: {{ book.btitle|length }} # 返回字符串或列表的长度 {{ book.bpub_date|date:'Y年-m月-d日' }} # 格式化日期格式 {{ content|default:'hello...
今天小编就为大家分享一篇django 自定义过滤器(filter)处理较为复杂的变量方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本文实例讲述了Django自定义过滤器定义与用法。分享给大家供大家参考,具体如下: 一、自定义过滤器的介绍 前面我们就介绍过过滤器其实就是一个函数,把要过来的字段传递到一个函数内,进行加工处理,返回一个新的值...
主要介绍了Django自定义模板过滤器和标签的实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
主要介绍了Django 过滤器汇总及自定义过滤器使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Autoforms是Jeff开源的一个基于Django的自定义表单引擎,可用于调查、投票、信息收集甚至是整合至工作流程引擎和PAAS平台当中。 AutoForms的主要特性: 支持14种字段类型13种html输入控件(包括日期选择组件)...
今天小编就为大家分享一篇django 自定义filter 判断if var in list的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本篇文章主要介绍了django中自定义标签和过滤器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
django中自定义了一些singals,用于监听一些操作,并发出通知 官方解释: Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。 简单来说,信号允许特定的sender通知一组receiver...
django+python自定义分页插件,简单易用,只需要三行代码即可展示自定义分页,支持多个展示效果
实现Django后台页面自定义、搜索功能(基于日期单搜索和日期项目名称多选项搜索)、数据显示(BootstrapTable翻页)、权限(控制表),同时优化输入框联想功能,希望对你有用。
简答实用的django框架https://pythondjango.cn/django/basics/1-introduction/
文档包含了Django1.8版本的全部内置过滤器。 csdn强制要积分,下载不来的就留邮箱。