python中英文字符和中文字符存储长度不同_Django如何正确截取中英混合字符串及表单中限制中文字符中长度...

中文字符和英文字符所占的字节长度是不一样,一个是2个字节,一个是1个字节,这给我们用英文的web框架开发中文app带来了麻烦。比如Django自带过滤器truncatewords并不支持截取中文,另外模型中CharField中的max_length选项用于限制中英混合字符串的长度基本上是失真的,需要额外自定义表单验证限制某些字段比如标题的长度。小编我今天就给大家分享几个例子和解决方案。

我们同样以博客的Article模型为例,我们试图限制标题的最大长度为90 个字符。

class Article(models.Model):

"""Article Model"""

title = models.CharField('Title', max_length=90,db_index=True)

90个英文字符也就是10来个单词,作为标题长度刚好合适。如果中文标题允许长达90个中文字符,这将是个恐怖的存在,也就意味着这里标题的长度限制对于中文或中英混杂字符串等于形同虚设。注意: Django CharField的max_length是按字符数来限制的,而不是字节数。同样Django的length模板过滤器和python的len函数默认也是统计字符数,而不是字节数。

更好的解决方法?我们统计中英混合字符串的字节数,然后通过表单实现按字节数来限制,代码如下所示。我们先通过python的encode方法将混合字符串转化为二进制数据,再使用python的len方法统计字节长度。用该方法“我是a"会被统计成5,而不是3。该方法并不完美,但我们可以实现限制标题长度为90个英文字符或45个中文字符。

class ArticleForm(forms.ModelForm):

class Meta:

model = Article

exclude = ['author', ]

def clean_title(self):

title = self.cleaned_data['title']

if len(title.encode('gb18030')) > 90: # 转成二进制统计字节 b'\xce\xd2\xca\xc7ab\xd6\xed')

raise forms.ValidationError('The length of title must be shorter than 90 chars.')

return title

另一个例子是我们经常需要根据正文截取文中开头部分作为摘要,使用Django自带的模板过滤器truncatechars和truncatewords仅适用于罗马及英文字符的,但对中文字符串完全不适用,如下所示:

{{ article.body|striptags|truncatewords:20 }}

这是我们需要自定义模板过滤器截取中英混合字符串,网上已有现成可用代码,我在这里转贴给大家备用。如果你不知道如何自定义Django模板过滤器及如何使用它们,请强烈阅读本文Django基础(16): 模板标签(tags)的分类及如何自定义模板标签

from django import template

from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter

@stringfilter

def cut_str(str, length=10):

"""

截取字符串,使得字符串长度等于length,并在字符串后加上省略号 """

is_encode = False

try:

str_encode = str.encode('gb18030') #b'\xce\xd2\xca\xc7ab\xd6\xed'

is_encode = True

except:

pass

if is_encode:

l = length*2

if l < len(str_encode):

l = l - 3

str_encode = str_encode[:l]

try:

str = str_encode.decode('gb18030') + '...'

except:

str_encode = str_encode[:-1]

try:

str = str_encode.decode('gb18030') + '...'

except:

is_encode = False

if not is_encode:

if length < len(str):

length = length - 2

return str[:length] + '...'

return str

使用时先载入自定义标签,再按如下使用即可:

{% load your_tags %}

{{ article.body|striptags|cut_str:120 }}

相关阅读Django基础(15): 模板过滤器(filter)的工作原理及如何自定义模板过滤器

Django实战: 利用自定义模板标签实现仿CSDN博客月度归档

Django实战专题: 开发专业博客(1)之内容管理后台开发

大江狗 - 微信公众号【Python Web与Django开发】

2020.2.15

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用RESTful客户端API进行GET / POST

互联网上有很多如何使用RESTful Client API的东西。 这些是基础。 但是&#xff0c;尽管该主题看起来微不足道&#xff0c;但仍然存在一些障碍&#xff0c;尤其是对于初学者而言。 在这篇文章中&#xff0c;我将尝试总结我的专业知识&#xff0c;以及我如何在实际项目中做到这…

南昌互联网行业协会筹办者祝真和华罡团队-2014年12月江西IDC排行榜

&#xfeff;&#xfeff;他出自军营&#xff0c;拥有一身正气。 他在南昌创业&#xff0c;立意卓越。 从站点開始、到微营销、到线上教育&#xff0c;全面开花。 他在朋友圈看到不对的内容&#xff0c;就会即时批评。 他对朋友&#xff0c;又是很的和蔼可亲。 他就是南昌华罡网…

Linux下查看某个进程的网络带宽占用情况

说明&#xff1a; 1、可能查看某个进程的带宽占用需要明确知道PID、进程名字、发送速度、接收速度。 2、很遗憾&#xff0c;在Linux原生的软件中没有这样的一款&#xff0c;只能额外装&#xff0c;最符合以上的情况就只有nethogs。 3、nethogs可以指定网卡&#xff0c;但是不能…

android中的add方法,Android入门之addWindow

前面说到&#xff0c;应用程序添加窗口时&#xff0c;会在本地创建一个ViewRoot&#xff0c;然后通过IPC(进程间通信)调用WmS的Session的addWindow请求WmS创建窗口&#xff0c;下面来看看addWindow方法。addWindow方法定义在frameworks/base/services/java/com.android.server.…

CSS属性速查表

前面的话 本文将按照布局类属性、盒模型属性、文本类属性、修饰类属性这四个分类&#xff0c;对CSS常用属性进行重新排列&#xff0c;并最终设置为一份stylelintrc文件 布局类 1、定位 positionz-indextopbottomleftright 2、浮动 floatclear 3、多列布局 columnscolumns-width…

我应该使用32位还是64位JVM?

这是我在企业软件开发生涯中多次遇到的问题。 我不得不每隔一段时间就提供有关配置特定新环境的建议。 而且&#xff0c;很多时候&#xff0c;手头的问题与“我应该使用32位或64位JVM”有关。 老实说&#xff0c;一开始我只是掷硬币。 而不是给出合理的答案。 &#xff08;对不…

python安装pyecharts清华_基于Python安装pyecharts所遇的问题及解决方法

最近学习到数据可视化内容&#xff0c;老师推荐安装pyecharts&#xff0c;于是pip install 了一下&#xff0c;结果...掉坑了&#xff0c;下面是我的跳坑经验&#xff0c;如果你有类似问题&#xff0c;希望对你有所帮助。第一个坑:这个不难理解&#xff0c;缺少pyecharts-jupyt…

C语言内存分配

C语言内存分配 C语言的内存分配主要有5个区域&#xff1a; 1、栈区&#xff1a;在运行函数时&#xff0c;函数内的局部变量&#xff08;不包含static变量&#xff09;、函数返回值的存储单元在栈区上创建。函数运行结束时这些存储单元自己主动被释放。栈区内存分配运算内置于处…

在Ajax方式产生的浮动框中,点击选项包含某个关键字的选项

#!usr/bin/env python #-*- coding:utf-8 -*- """ author: sleeping_cat Contact : zwy24zwy163.com """ #在Ajax方式产生的浮动框中&#xff0c;点击选项包含某个关键字的选项 #通过模拟键盘下箭头进行选择悬浮框选项from selenium imp…

android studio点击图片,如何在Android Studio中的模拟器图库中添加图像?

如何在Android Studio中的模拟器图库中添加图像&#xff1f;我正在开发图像过滤器应用程序。 但是&#xff0c;如果我没有任何图像&#xff0c;就无法真正尝试。我知道我可以在电话中对其进行测试&#xff0c;但这并不相同&#xff0c;因为我需要错误消息和其他内容。我只想从A…

移动端学习目录

前面的话 iphone4发布是几年前的事情&#xff0c;而如今早已是移动互联网的时代。人们不再正襟危坐在电脑前&#xff0c;而更愿意把时间耗费在手机上&#xff0c;随时随地地享受互联网。在移动端可以使用最新最炫的前端技术&#xff0c;而不用再考虑老版本IE的兼容性。当前&…

实践中的构建者模式

我将不深入讨论该模式&#xff0c;因为已经有大量的帖子和书籍对此进行了详细的解释。 相反&#xff0c;我将告诉您为什么以及何时应该考虑使用它。 但是&#xff0c;值得一提的是&#xff0c;这种模式与《 四人帮》一书中介绍的模式有些不同。 虽然原始模式着重于抽象化构造步…

python计算汽车的平均油耗_用python对汽车油耗进行数据分析

原标题&#xff1a;用python对汽车油耗进行数据分析- 从http://fueleconomy.gov/geg/epadata/vehicles.csv.zip下载汽车油耗数据集并解压- 进入jupyter notebook(ipython notebook)并新建一个New Notebook- 输入命令[python]view plaincopyimportpandas as pdimportnumpy as np…

git常用命令2

##一、git常用命令 ###1、 push文件 * 打开cmd窗口 * 输入f:&#xff0c;进入f:&#xff08;自己随便在自己的电脑上找个位置就行了&#xff0c;这里的f:&#xff0c;表示的是f盘&#xff09; * 然后输入mkdir workSpace&#xff0c;会自动在f盘下生成一个workSpace文件夹 * 然…

android移动应用基础教程源代码,Android移动应用基础教程 【程序活动单元Activity】...

本章目录一、Activity的生命周期1、生命周期状态2 、生命周期方法3、横竖屏切换时的生命周期二、Activity的创建配置和关闭1、Activity的创建2、配置Activity3、开启和关闭Activity三、Intent与IntentFilter1、Intent介绍1.1 意图的概念1.2 显式意图1.3 隐式意图2、IntentFilte…

elasticsearch中cluster和transport知识

elasticsearch cluster 概述 elasticsearch节点间通信的基础transport转载于:https://www.cnblogs.com/wzj4858/p/8126033.html

Python中使用subplot在一张画布上显示多张图

subplot(arg1, arg2, arg3) arg1: 在垂直方向同时画几张图arg2: 在水平方向同时画几张图arg3: 当前命令修改的是第几张图 t np.arange(0,5,0.1) y1 np.sin(2*np.pi*t) y2 np.sin(2*np.pi*t) plt.subplot(211) plt.plot(t,y1,b-.) plt.subplot(212) plt.plot(t,y2,r--) plt.s…

Java 8:从PermGen到元空间

您可能已经知道&#xff0c;现在可以下载JDK 8 Early Access 。 这使Java开发人员可以尝试Java 8的一些新语言和运行时功能。这些功能之一是完全删除自Oracle自JDK 7发行以来就宣布的Permanent Generation&#xff08;PermGen&#xff09;空间。例如&#xff0c;自JDK 7起&…

oracle symonym_ORACLE SYNONYM详解

以下内容整理自Oracle 官方文档一 概念A synonym is an alias for any table, view,materialized view, sequence, procedure, function, package, type, Java classschema object, user-defined object type, or another synonym. Because a synonymis simply an alias, it re…

浏览器缓存问题原理以及解决方案

浏览器缓存问题&#xff1a; 简单来说&#xff0c;浏览器缓存就是把一个已经请求过的Web资源&#xff08;如html页面&#xff0c;图片&#xff0c;js&#xff0c;数据等&#xff09;拷贝一份副本储存在浏览器中。缓存会根据进来的请求保存输出内容的副本。当下一个请求来到的时…