重庆网站建站系统,长春市星宿科技网站建设公司怎么样,能制作网站的软件,做设计专业的能做网站吗中文字符和英文字符所占的字节长度是不一样#xff0c;一个是2个字节#xff0c;一个是1个字节#xff0c;这给我们用英文的web框架开发中文app带来了麻烦。比如Django自带过滤器truncatewords并不支持截取中文#xff0c;另外模型中CharField中的max_length选项用于限制中…中文字符和英文字符所占的字节长度是不一样一个是2个字节一个是1个字节这给我们用英文的web框架开发中文app带来了麻烦。比如Django自带过滤器truncatewords并不支持截取中文另外模型中CharField中的max_length选项用于限制中英混合字符串的长度基本上是失真的需要额外自定义表单验证限制某些字段比如标题的长度。小编我今天就给大家分享几个例子和解决方案。我们同样以博客的Article模型为例我们试图限制标题的最大长度为90 个字符。class Article(models.Model):Article Modeltitle models.CharField(Title, max_length90,db_indexTrue)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 Articleexclude [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 templatefrom django.template.defaultfilters import stringfilterregister template.Library()register.filterstringfilterdef cut_str(str, length10):截取字符串使得字符串长度等于length并在字符串后加上省略号 is_encode Falsetry:str_encode str.encode(gb18030) #b\xce\xd2\xca\xc7ab\xd6\xedis_encode Trueexcept:passif is_encode:l length*2if l len(str_encode):l l - 3str_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 Falseif not is_encode:if length len(str):length length - 2return 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