【问题标题】:Special characters in Django HTML templatesDjango HTML 模板中的特殊字符
【发布时间】:2014-01-16 02:03:29
【问题描述】:

我正在尝试在 Django HTML 模板中写一些带有特殊字符的东西,例如“é”或“ê”,但它不起作用。并且 Django 返回此错误消息:

UnicodeDecodeError at /
'utf8' codec can't decode byte 0x97 in position 248: invalid start byte

这是整个回溯: 环境:

Request Method: GET
Request URL: http://127.0.0.1:8000/

Django Version: 1.6.1
Python Version: 2.7.5
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'survey',
 'south',
 'django_reset',
 'chartkick',
 'registration')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/filipeferminiano/Documents/django/panorama/survey/views.py" in home
  35.         return render(request, 'home.html')
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/shortcuts/__init__.py" in render
  53.     return HttpResponse(loader.render_to_string(*args, **kwargs),
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  162.         t = get_template(template_name)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/loader.py" in get_template
  138.     template, origin = find_template(template_name)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/loader.py" in find_template
  127.             source, display_name = loader(name, dirs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/loader.py" in __call__
  43.         return self.load_template(template_name, template_dirs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/loader.py" in load_template
  46.         source, display_name = self.load_template_source(template_name, template_dirs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/template/loaders/filesystem.py" in load_template_source
  38.                     return (fp.read().decode(settings.FILE_CHARSET), filepath)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py" in decode
  16.     return codecs.utf_8_decode(input, errors, True)

Exception Type: UnicodeDecodeError at /
Exception Value: 'utf8' codec can't decode byte 0x87 in position 230: invalid start byte

呈现模板的视图:

def home(request):
    if request.user.is_authenticated():
        browser_stats = [['Chrome', 52.9], ['Firefox', 27.7], ['Opera', 1.6],
                     ['Internet Explorer', 12.6], ['Safari', 4]]
        return HttpResponseRedirect('/profile/')
    else:
        return render(request, 'home.html')

模板的url:

url(r'^$', 'survey.views.home', name='home'),

【问题讨论】:

    标签: html django django-templates


    【解决方案1】:

    三件事:

    • 请放

    # -*- coding: utf-8 -*-

    在 .py 文件的开头。

    • 该 .py 文件必须是不带 BOM 文件的 UTF-8(编码 - 从 Notepad++ 转换为不带 BOM 的 UTF-8)

    • 此外,包含 Unicode 字符的文本字符串应以 u 开头。所以你应该写text=u'unicode here'这样的东西。

    如果您仍然看到相同的错误,请提供完整的堆栈跟踪。此外,<meta charset="utf-8"> 与客户端相关,与 django 异常无关。

    【讨论】:

    • 但是在views.py中只有一个html文件的重定向。而且文本不是从 django 渲染到 html 的变量,它是纯 HTML 文本。
    • 请使用异常的完整堆栈跟踪更新您的问题。另外,您的 UTF-8 html 模板是否没有 bom ?如果没有,请使用记事本++ 进行转换。最后,提供 view.py 和 urls.py 中渲染上述模板的部分。
    • 好的,我已经更新了。并且文件使用 utf-8 编码,没有 bom
    • 这似乎是您的模板中的一个问题。由于我不知道的原因,您的模板包含非 unicode 字符,因此 django 无法对其进行解码。您是否仔细检查过您的模板实际上是否已转换为 UTF-8 w/o BOM ?此外,正如您所理解的,还有一些违规字符:尝试从一个干净的 home.html 模板开始,有效并逐渐添加更多文本,直到您找出哪些是违规字符...我想不出更好的解决方案:(
    • 好的,我已经解决了这个问题。我删除了所有旧文件并替换为具有相同名称和代码的新文件。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2011-05-13
    • 2012-11-21
    相关资源
    最近更新 更多