【问题标题】:Unicode convertion problem in django viewdjango视图中的Unicode转换问题
【发布时间】:2019-04-19 15:58:33
【问题描述】:

我在 Django 视图中有一个查询集:

queryset = CourseTeacher.objects.filter(cls__uuid__in=uuidlist).annotate(teacher_fullname=Concat('teacher__name', V(' '), 'teacher__surname'))

有些字符会导致 UnicodeDecodeError 异常。Teacher_fullname 或 teacher_surname 可能有这些字符。因此它给出以下警告:

异常类型:UnicodeDecodeError 异常值:
“ascii”编解码器无法解码位置 12 中的字节 0xc3:序数不在范围内(128)

无法编码/解码的字符串是:John ��。易

我正在尝试将此字符串写入 Excel 工作表,如下所示:

worksheet.write(teachersrow, item['teacher_fullname'].encode('utf-8'), cellformat)

.encode('utf-8') 似乎没有解决问题

使用 Django 1.9.5 和 Python 2.7.5

完整的追溯是:

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)

原代码为:

worksheet.write(teachersrow, item['teacher_fullname'], cellformat)

在上下文中查看代码:

        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            

【问题讨论】:

  • 请在添加encode之前显示完整的回溯以及您最初尝试的代码。
  • 我在添加编码之前添加了完整的回溯和代码
  • 我使用的是 Centos 7. Python 2.7.5
  • 嗯,这应该可以。您能否在上下文中显示该代码,从您创建工作表和查询集的位置?
  • 在上下文中添加代码

标签: python django django-views django-queryset


【解决方案1】:

解决了,

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

alter table class_teacher 转换为字符集 utf8 collat​​e utf8_general_ci;

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2014-02-24
    • 1970-01-01
    • 2014-07-22
    • 2016-12-21
    相关资源
    最近更新 更多