搜索时翻译
这个思路受到了字符集的启发,如果我在本地定义一本字符集,里面存入某个英文单词和与之对应的中文翻译,这不就能实现翻译功能了么。
思路有了,那就来具体实现,首先最简单的定义字符集方式就是文件,需要了解python的文件读写技术;之后通过特定规则将文件中的英文与中文分两组并一一对应,这就用到了字符串切片技术(文件中读取的内容为字符串)。
def translate(key):
#如果包含汉字则原样返回
if(is_contains_chinese(key) == True):
return key
key_index = 0
f = open('XunLu_details/doc/translate.txt','r')
list_en = []
list_cn = []
#切分字符串,英文与中文,并存入不同列表中
for row in f:
#利用替换的方法删去换行,规范字符串
row = row.replace('\n','')
row_split = row.split(':')
list_en.append(row_split[0])
list_cn.append(row_split[1])
for index,value in enumerate(list_en):
if(key == value):
key_index = index
return list_cn[key_index]
f.close()
#判断是否汉字
def is_contains_chinese(strs):
for char in strs:
if '\u4e00' <= char <= '\u9fa5':
return True
return False
定义了两个函数,其中第二个函数的作用是根据汉字在unique字符集中的顺序判断所传内容(key)是否为汉字。
translate函数是实现将translate.txt文件中的记录分组并查找,因为文件中我是这样定义的,
英文与中文之间仅有一个冒号,行与行之间有一个默认的换行符,所以可以用split(':')与replace('\n','')来按照冒号切分并隐去换行,这里注意每一次对文件的循环都能读取到一整行数据(加上换行符)。
这样就可得到两组数据,且这两组数据的下标一一对应,如第一组["love","born"],第二组["爱","生"],
再通过enumerate将所传入英文的下标找到,并返回对应中文数组中的下标,正常搜索就好啦。
搜索时可以通过len方法,根据所传关键字个数来判断(关键字用空格隔开)
#记录切分列表中有多少数据
keyCount = len(key)
#调用translate函数,判断所得key是否为中文,并翻译
for index,value in enumerate(key):
key[index] = translate(value)
from django.db.models import Q #Q类实现filter中的或运算
if(keyCount == 2):
key_str1 = key[0]
key_str2 = key[1]
data = Message.objects.filter(Q(title__contains=key_str1)|Q(title__contains=key_str2))
elif(keyCount == 3):
key_str1 = key[0]
key_str2 = key[1]
key_str3 = key[2]
data = Message.objects.filter(Q(title__contains=key_str1)|Q(title__contains=key_str2)|Q(title__contains=key_str3))
#如果字符串超过三个只搜索第一个
else:
#将列表数据转换为字符串
key_str = key[0]
#模糊查询,并用values通过字典返回
data = Message.objects.filter(title__contains=key_str)
如果关键字是两个或三个,会分别执行两参或三参的或查询
enumerate函数
必须通过两个循环变量来遍历其中的可迭代内容,前者为下标、后者为值
提取TXT文本中指定内容——pythonhttps://blog.csdn.net/weixin_44409075/article/details/88080091删除python字符串中指定的字符
https://m.py.cn/faq/python/22313.html
Django分页
需要的类:django.core.paginator.Paginator(不同Django版本的位置可能会微调,根据编译器提示即可)
我使用GET方法传页码,这里需要给一个默认值才行
然后初始化对象,并把获取到的当前页码加进去
此时通过object_list获取到的data数据集中当前页应显示的数据,将它们分条显示即可。
注意:经测data可以直接传QuerySet类数组;Paginator第二参控制每页显示条数;GET接收到的可能是字符串,int一下最保险