Django'ascii'编解码器不能编码字符

Gra*_*ntU 16 django django-templates

在Django中,我想使用一个简单的模板标签来截断数据.

这是我到目前为止:

@register.filter(name='truncate_simple')
def truncate_char_to_space(value, arg):
    """
    Truncates a string after a given length.
    """
    data = str(value)
    if len(value) < arg:
        return data

    if data.find(' ', arg, arg+5) == -1:
        return data[:arg] + '...'
    else:
        return data[:arg] + data[arg:data.find(' ', arg)] + '...'
Run Code Online (Sandbox Code Playgroud)

但是当我使用它时,我收到以下错误:

{{ item.content|truncate_simple:5  }}
Run Code Online (Sandbox Code Playgroud)

错误:

'ascii'编解码器无法对位置84中的字符u'\ u2013'进行编码:序数不在范围内(128)

错误在线启动 data = str(value)

为什么?

max*_*ver 26

如果您正在使用django和python 2.7,这会为我修复它:

from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class Utente(models.Model):
Run Code Online (Sandbox Code Playgroud)

请参阅https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.encoding.python_2_unicode_compatible


art*_*rex 11

尝试使用unicode()转换值(而不是str()):

data = unicode(value)
Run Code Online (Sandbox Code Playgroud)

  • 请不要随意建议添加编码声明.问题与此无关 - 它用于定义源文件中字符文字的编码. (10认同)
  • @DanielRoseman 关于编码声明是正确的。解码字符 unicode(value) 就足够了。 (2认同)

Eva*_* Hu 5

@ max4ever的回答对我有用.有时候你应该将这一行放在python文件的头部:

from __future__ import unicode_literals
Run Code Online (Sandbox Code Playgroud)

在解决像这样的unicode编码问题时它会很有帮助.


Rub*_*lix 5

在settings.py中添加此

import sys
reload(sys)
sys.setdefaultencoding('UTF8')
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是个坏主意,因为它可能会破坏使用不同编码的库。 (3认同)