KeyError с Django, общительным приложением и акцентными персонажами? - PullRequest
1 голос
/ 14 июня 2010

У меня проблема с моими акцентными персонажами. Администратор Django сохраняет мои данные без кодирования во что-то вроде "á"

Пример: если я пытаюсь использовать слово типа "Canción", я бы хотел сохранить его таким образом: Canción, а не Canción.

у меня в настройках: DEFAULT_CHARSET = 'utf-8'

У меня в базе данных MySQL: utf8_general_ci

Я использую приложение Sociable:

{% 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 ]

4 голосов
/ 14 июня 2010

Проблема заключается в том, что для общения используется стандартная реализация Python 2.6 urllib.quote_plus, которая не является безопасной для Юникода. Они должны использовать django django.utils.http.urlquote_plus, который является безопасным для Unicode.

Чтобы ответить на другую часть вашего вопроса, если вы действительно хотите сохранить экранированные строки в своей базе данных (что я не рекомендую), вы можете вызвать метод, который выполняет экранирование в методе сохранения модели. Однако нет встроенной утилиты python или django, которая бы выполняла экранирование юникода в html-сущность, о которой я знаю. Однако, быстрый поиск в Google покажет несколько. Опять же, я не рекомендую делать это. Django безопасен для Unicode, и лучше воспользоваться этим фактом!

1 голос
/ 14 июня 2010

Это ошибка в django-sociable, из-за которой она неправильно обрабатывает unicode. Я рекомендую сообщить об этой ошибке и затем поработать с разработчиком над исправлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...