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.pswp.cn/news/370112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370112.shtml
英文地址,請注明出處:http://en.pswp.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;拷貝一份副本儲存在瀏覽器中。緩存會根據進來的請求保存輸出內容的副本。當下一個請求來到的時…