python - Unicode convertion problem in django view
问题描述
I have a queryset in Django view :
queryset = CourseTeacher.objects.filter(cls__uuid__in=uuidlist).annotate(teacher_fullname=Concat('teacher__name', V(' '), 'teacher__surname'))
There are some characters that causes UnicodeDecodeError exception.Teacher_fullname or teacher_surname may have these characters. So that it gives below warning:
Exception Type: UnicodeDecodeError Exception Value:
'ascii' codec can't decode byte 0xc3 in position 12: ordinal not in range(128)The string that could not be encoded/decoded was: John ��. YI
I am trying to write this string to excell worksheet as below :
worksheet.write(teachersrow, item['teacher_fullname'].encode('utf-8'), cellformat)
.encode('utf-8') seems not solving the problem
Using Django 1.9.5 and Python 2.7.5
Full traceback is :
Traceback:
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "./college/views.py" in print_course_teacher
1341. workbook.close()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/workbook.py" in close
306. self._store_workbook()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/workbook.py" in _store_workbook
649. xml_files = packager._create_package()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/packager.py" in _create_package
140. self._write_shared_strings_file()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/packager.py" in _write_shared_strings_file
287. sst._assemble_xml_file()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/sharedstrings.py" in _assemble_xml_file
54. self._write_sst_strings()
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/sharedstrings.py" in _write_sst_strings
84. self._write_si(string)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/sharedstrings.py" in _write_si
122. self._xml_si_element(string, attributes)
File "/home/myproject/Env/myproject/lib/python2.7/site-packages/xlsxwriter/xmlwriter.py" in _xml_si_element
122. self.fh.write("""<si><t%s>%s</t></si>""" % (attr, string))
File "/home/myproject/Env/myproject/lib64/python2.7/codecs.py" in write
691. return self.writer.write(data)
File "/home/myproject/Env/myproject/lib64/python2.7/codecs.py" in write
351. data, consumed = self.encode(object, self.errors)
Exception Type: UnicodeDecodeError at /print-course-teacher/
Exception Value: 'ascii' codec can't decode byte 0xc3 in position 12: ordinal not in range(128)
Original code is :
worksheet.write(teachersrow, item['teacher_fullname'], cellformat)
View code in contex :
uuidlist = []
for classuuid in optional_class_object:
uuidlist.append(classuuid['uuid'])
queryset = CourseTeacher.objects.filter(cls__uuid__in=uuidlist).annotate(teacher_fullname=Concat('teacher__name', V(' '), 'teacher__surname')) | CourseTeacher.objects.filter(cls__uuid=cls_uuid).annotate(teacher_fullname=Concat('teacher__name', V(' '), 'teacher__surname')).order_by("cls__name")
last_semester = "2017-2018"
workbook = xlsxwriter.Workbook('table.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write("A2", "Semester [ "+str(last_semester)+" ] ")
cellformat = workbook.add_format({
'border': 1,
'align': 'left',
'valign': 'top',
'fg_color': 'white'})
row = 4
for item in queryset.values('cls__year', 'cls__name', 'course__code', 'course__name', 'teacher_fullname', 'credit', 'hours_weekly').reverse():
classrow = "A"+str(row)
coursecoderow = "B"+str(row)
coursenamerow = "C"+str(row)
creditrow = "D"+str(row)
hoursweeklyrow = "E"+str(row)
teachersrow = "F"+str(row)
worksheet.write(classrow, str(item['cls__year'])+""+item['cls__name'], cellformat)
worksheet.write(coursecoderow, item['course__code'].encode('utf-8'), cellformat)
worksheet.write(coursenamerow, item['course__name'].encode('utf-8'), cellformat)
worksheet.write(creditrow, item['credit'], cellformat)
worksheet.write(hoursweeklyrow, item['hours_weekly'], cellformat)
worksheet.write(teachersrow, item['teacher_fullname'].encode('utf-8'), cellformat)
row = row + 1
workbook.close()
with open("table.xlsx", 'rb') as fh:
response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
response['Content-Disposition'] = 'inline; filename=' + os.path.basename("table.xlsx")
os.remove("table.xlsx")
return response
解决方案
解决了,
正如 Daniel Roseman 所说,代码没问题。我检查了数据库,发现表排序规则是 latin1。我将其更改为 utf-8。现在它起作用了。
alter table class_teacher convert to character set utf8 collate utf8_general_ci;
推荐阅读
- scala - 如何从 Scala 中的方法返回所需的数据类型,特别是当方法中有 try/catch 块时?
- r - R 文档中的条件 HTML 实体
- javascript - 如何在使用 Vue 3 UMD 构建的 HTML 单个文件中使用 Vue 2 组件
- android - 当视图没有焦点时隐藏键盘
- azure - Azure AD B2C 在自定义提供程序 Azure AD 登录页面中添加后缀
- r - 在缺少结果时使用 nlme 正确建模纵向相关性 (R)
- python - 数据作为数据帧附加到内存中
- javascript - 在倒计时的最后 100 毫秒内执行代码
- docker - 无法在 jenkins 中使用其他标志构建 docker 映像
- java - Java Scanner、Arraylist 和 while 循环