具有 python 2.7 utf-8 问题的 Django
Django with python 2.7 utf-8 problems
我在 (html) 模板中对字符宽度编码有问题。在我的数据库中有如下结果:
- 查萨
- 希尚杰
这句话是克罗地亚语。在我的 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 页面中,作为选择器。
当我尝试加载该页面时出现此错误:
- 异常类型:UnicodeEncodeError
- 异常值:'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
希望对您有所帮助,祝您编码愉快!
我在 (html) 模板中对字符宽度编码有问题。在我的数据库中有如下结果:
- 查萨
- 希尚杰
这句话是克罗地亚语。在我的 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 页面中,作为选择器。 当我尝试加载该页面时出现此错误:
- 异常类型:UnicodeEncodeError
- 异常值:'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
希望对您有所帮助,祝您编码愉快!