首页 > 解决方案 > 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            

标签: pythondjangodjango-viewsdjango-queryset

解决方案


解决了,

正如 Daniel Roseman 所说,代码没问题。我检查了数据库,发现表排序规则是 latin1。我将其更改为 utf-8。现在它起作用了。

alter table class_teacher convert to character set utf8 collat​​e utf8_general_ci;


推荐阅读