Django,Sociable app和重音字符的KeyError?

时间:2010-06-14 02:39:00

标签: django django-models django-templates sociable

我的重音字符有问题。 Django管理员将我的数据保存而不编码为“á

示例:如果我试图使用像“Canción”这样的单词,我希望以这种方式保存:Canción,而不是Canción。

我在我的设置中:DEFAULT_CHARSET = 'utf-8'

我的mysql数据库中有utf8_general_ci

我正在使用Sociable app:

{% load sociable_tags %}

{% get_sociable Facebook TwitThis Google MySpace del.icio.us YahooBuzz Live as sociable_links with url=object.get_absolute_url title=object.titulo %}
{% for link in sociable_links %}
    <a href="{{ link.link }}"><img alt="{{ link.site }}" title="{{ link.site }}" src="{{ link.image }}" /></a>
{% endfor %}

但是如果我的object.titulo(文章标题)有一个带重音的单词,我就会收到错误。

Traceback:
File "C:\wamp\bin\Python26\lib\site-packages\django\core\handlers\base.py" in get_response
  100.                     response = callback(request, *callback_args, **callback_kwargs)
File "C:\wamp\bin\Python26\lib\site-packages\django\views\generic\date_based.py" in object_detail
  366.     response = HttpResponse(t.render(c), mimetype=mimetype)
File "C:\wamp\bin\Python26\lib\site-packages\django\template\__init__.py" in render
  173.             return self._render(context)
File "C:\wamp\bin\Python26\lib\site-packages\django\template\__init__.py" in _render
  167.         return self.nodelist.render(context)
File "C:\wamp\bin\Python26\lib\site-packages\django\template\__init__.py" in render
  796.                 bits.append(self.render_node(node, context))
File "C:\wamp\bin\Python26\lib\site-packages\django\template\debug.py" in render_node
  72.             result = node.render(context)
File "C:\wamp\bin\Python26\lib\site-packages\django\template\loader_tags.py" in render
  125.         return compiled_parent._render(context)
File "C:\wamp\bin\Python26\lib\site-packages\django\template\__init__.py" in _render
  167.         return self.nodelist.render(context)
File "C:\wamp\bin\Python26\lib\site-packages\django\template\__init__.py" in render
  796.                 bits.append(self.render_node(node, context))
File "C:\wamp\bin\Python26\lib\site-packages\django\template\debug.py" in render_node
  72.             result = node.render(context)
File "C:\wamp\bin\Python26\lib\site-packages\django\template\loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "C:\wamp\bin\Python26\lib\site-packages\django\template\__init__.py" in render
  796.                 bits.append(self.render_node(node, context))
File "C:\wamp\bin\Python26\lib\site-packages\django\template\debug.py" in render_node
  72.             result = node.render(context)
File "C:\wamp\bin\Python26\lib\site-packages\sociable\templatetags\sociable_tags.py" in render
  37.                 'link': sociable.genlink(site, **self.values),
File "C:\wamp\bin\Python26\lib\site-packages\sociable\sociable.py" in genlink
  20.         values['title'] = quote_plus(kwargs['title'])
File "C:\wamp\bin\Python26\lib\urllib.py" in quote_plus
  1228.         s = quote(s, safe + ' ')
File "C:\wamp\bin\Python26\lib\urllib.py" in quote
  1222.     res = map(safe_map.__getitem__, s)

Exception Type: TemplateSyntaxError at /noticia/2010/jun/10/matan-domingo-paquete-en-la-avenida-san-vicente-de-paul/
Exception Value: Caught KeyError while rendering: u'\xfa'

谢谢!

2 个答案:

答案 0 :(得分:4)

问题是,sociable正在使用python 2.6的默认urllib.quote_plus实现,这不是unicode安全的。他们应该使用django的django.utils.http.urlquote_plus unicode-safe。

要回答问题的其他部分,如果您真的想在数据库中存储转义字符串(我不建议这样做),您可以调用一个在模型的save方法中进行转义的方法。但是,没有内置的python或django实用程序来执行我所知道的unicode-to-html-entity转义。然而,快速谷歌搜索会出现几次。但是,我不建议这样做。 Django是Unicode安全的,最好利用这个事实!

答案 1 :(得分:1)

这是django-sociable本身的一个错误,因为它错误地处理unicode。我建议reporting this bug,然后与开发人员一起修复。