【问题标题】:Django with python 2.7 utf-8 problemsDjango 与 python 2.7 utf-8 问题
【发布时间】:2015-04-29 14:33:06
【问题描述】:

我在 (html) 模板中遇到宽度编码字符问题。在我的数据库中有类似的结果:

  1. Čaša
  2. Šišanje

这些词是克罗地亚语。在我的 settings.py 中 LANGUAGE_CODE 我已经设定 : LANGUAGE_CODE = 'hr-HR' 也尝试使用 LANGUAGE_CODE = 'hr'。 问题是当数据库以表单形式返回记录时:

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

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

  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。

【问题讨论】:

    标签: python django python-2.7 encoding utf-8


    【解决方案1】:

    将您的 __str__ 方法更改为 __unicode__

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

    在 Django 中,模型实例上的 CharFields 返回 Unicode 对象。在 Python 2.x 中,__str__ 方法应该返回一个编码的字节串而不是一个 Unicode 对象,因此通过返回未编码的 name 会导致 Django 将 Unicode 对象与字节串混合。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢@aumo 的解释
      【解决方案3】:
      import sys
      reload(sys)
      sys.setdefaultencoding('utf-8')
      

      你试过了吗?

      【讨论】:

      • Ooooooo 它有效:D。太感谢你了! @skyline75489
      • 这只是隐藏问题。有关可能的副作用的一些讨论,请参阅mail.python.org/pipermail/python-dev/2009-August/091406.html
      • 这是一个很棒的快速修复,但根据彼得的链接,这可能会产生一些非常难看的副作用,tnx tho
      【解决方案4】:

      这是一个较晚的答案,但对于那些在 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
      

      希望这对编码有所帮助和快乐!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 2017-03-07
        • 2011-06-16
        • 1970-01-01
        相关资源
        最近更新 更多