具有 python 2.7 utf-8 问题的 Django

Django with python 2.7 utf-8 problems

我在 (html) 模板中对字符宽度编码有问题。在我的数据库中有如下结果:

  1. 查萨
  2. 希尚杰

这句话是克罗地亚语。在我的 settings.py 中 LANGUAGE_CODE 我已经设定 : LANGUAGE_CODE = 'hr-HR' 也尝试了 LANGUAGE_CODE = 'hr'。 问题是当数据库 returns 以表格形式记录时:

category = forms.ModelChoiceField(queryset=Category.objects.all().filter(type_id="2"),
                                      widget=forms.Select(attrs={'class': 'selectpicker'}), label=('Kategorija'),
                                      initial='1', )

并且该字段的所有记录都必须呈现在 HTML 页面中,作为选择器。 当我尝试加载该页面时出现此错误:

  1. 异常类型:UnicodeEncodeError
  2. 异常值:'ascii'编解码器无法对位置序号不在范围内的字符 u'\u0107' 进行编码 (128)

Python 版本:2.7.9

Django 版本:1.7.7

在我的models.py中,模型是:

class Category(models.Model):
    id = models.AutoField(primary_key=True)
    type_id = models.ForeignKey('CategoryType')
    name = models.CharField(max_length=255)

    def __str__(self):
        return str(self.name)

我也尝试过:

  class Category(models.Model):
        id = models.AutoField(primary_key=True)
        type_id = models.ForeignKey('CategoryType')
        name = models.CharField(max_length=255)

        def __str__(self):
            return self.name

你知道解决这个问题的简单方法吗,我知道 python 3 有更好的 utf 编码,但我想留在 2.7。

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

你试过吗?

使用 Python 2.7 时,您需要覆盖模型的 __unicode__ 方法,而不是 __str__。 Django 将使用 UTF8 处理 unicode 解码。

将您的 __str__ 方法更改为 __unicode__

您看到的异常来自混合编码的字节串和 Unicode 对象。为此,Python 2.x 尝试使用默认编码隐式编码 Unicode 对象,如果不能则引发异常。因此,当您的默认编码为 ascii 时,u'foo' + 'bar' 有效,但 u'foo\u270c' + 'bar' 无效。

在 Django 中,CharField模型实例 return Unicode 对象。在 Python 2.x 中,__str__ 方法预期 return 一个编码字节串而不是 Unicode 对象,因此通过 returning name un -encoded 你导致 Django 将 Unicode 对象与 bytestrings 混合。

您也可以通过在 __str__ 方法中显式编码 name 来修复它,但如果 __unicode__ 被正确定义,这是默认行为。

这是一个迟到的答案,但对于那些在 python 2.x 下使用 django 的人,请考虑遵循 django's recommended way to deal with __str__ and __unicode__.

这不仅有利于您的 django 项目从 python 2.x 到 3.x 的可移植性,而且它应该可以解决大部分与编码相关的问题。

这里是 models.py 应该如何调整以遵循 django 推荐的使用装饰器的方式:

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class Category(models.Model):
    id = models.AutoField(primary_key=True)
    type_id = models.ForeignKey('CategoryType')
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

希望对您有所帮助,祝您编码愉快!