2 votes

Comment modifier les données reçues via des formulaires dans django ?

J'apprends Django. Il y a une barre de recherche. Elle est destinée à être utilisée avec des mots russes. Le mot est attrapé avec un formulaire simple.

Comment puis-je encoder le mot en utf-8 dès le début ? Il crée l'erreur UnicodeEncodeError à un moment donné à cause de cela. Ou bien quelles sont les façons de modifier la demande originale ?

La base de données est configurée en utf-8.

Merci.

Voici le Traceback

Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)

File "/home/teodor/moldova/search/views.py" in results
  27.   return render_to_response(template_name, locals(), context_instance = RequestContext(request))

File "/usr/local/lib/python2.6/dist-packages/django/shortcuts/__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

File "/usr/local/lib/python2.6/dist-packages/django/template/loader.py" in render_to_string
  176.         return t.render(context_instance)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in render
  140.             return self._render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)

File "/usr/local/lib/python2.6/dist-packages/django/template/debug.py" in render_node
  74.             return node.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)

File "/usr/local/lib/python2.6/dist-packages/django/template/debug.py" in render_node
  74.             return node.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)

File "/usr/local/lib/python2.6/dist-packages/django/template/debug.py" in render_node
  74.             return node.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)

File "/usr/local/lib/python2.6/dist-packages/django/template/debug.py" in render_node
  74.             return node.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)

File "/usr/local/lib/python2.6/dist-packages/django/template/debug.py" in render_node
  74.             return node.render(context)

File "/usr/local/lib/python2.6/dist-packages/django/template/base.py" in render
  1178.                     _dict = func(*resolved_args, **resolved_kwargs)

File "/home/teodor/moldova/search/templatetags/search_tags.py" in pagination_links
  23.   params = urllib.urlencode(raw_params)

File "/usr/lib/python2.6/urllib.py" in urlencode
  1267.             v = quote_plus(str(v))

Exception Type: UnicodeEncodeError at /search/results/
Exception Value: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

J'ai fait une recherche sur le mot :

0voto

Paul D. Waite Points 35456

Je n'ai pas beaucoup d'expérience en la matière, mais selon Le guide de Jonathan "Wolf" Rentzsch sur l'utilisation d'UTF-8 sur le web vous pouvez essayer d'ajouter l'option accept-charset="UTF-8" à votre <form> étiquette.

Où voyez-vous le UnicodeEncodeError ? Pouvez-vous nous montrer un code ?

Edit : Ah, ok. Yup - Je pensez à Django fournit tous les textes sous forme d'objets Unicode. Si je comprends correctement la traceback, le problème se produit lorsque vous appelez str sur cet objet unicode pour l'utiliser avec urllib.quote_plus .

I pensez à vous devez fournir urllib.quote_plus avec du texte codé en ASCII (voir par exemple Existe-t-il un substitut prêt pour l'unicode que je peux utiliser pour urllib.quote et urllib.unquote dans Python 2.6.5 ? ).

Et selon cette question je pense que tu peux faire ça comme ça :

import unicodedata
v_as_ascii = unicodedata.normalize('NFKD', v.decode('UTF-8')).encode('ascii', 'ignore')
v = quote_plus( v_as_ascii )

(Je n'ai pas testé tout cela, donc je peux me tromper complètement. Espérons que quelqu'un qui a de l'expérience avec ce genre de choses passera par là).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X