python - from - peticiones post django
Django: ¿Puedo crear un QueryDict desde un diccionario? (4)
Imagina que tengo un diccionario en mi aplicación Django:
dict = {''a'': ''one'', ''b'': ''two'', }
Ahora quiero crear fácilmente una lista urlencoded de parámetros GET de este diccionario. Por supuesto, podría recorrer el diccionario, las claves y los valores de urlencode y luego concatenar la cadena por mí mismo, pero debe haber una forma más fácil. Me gustaría usar una instancia de QueryDict. QueryDict es una subclase de dict, por lo que debería ser posible de alguna manera.
qdict = QueryDict(dict) # this does not actually work
print qdict.urlencode()
¿Cómo haría que la segunda hasta la última línea funcionara?
¿Qué tal si?
from django.http import QueryDict
dict = {''a'': ''one'', ''b'': ''two'', }
qdict = QueryDict('''', mutable=True)
qdict.update(dict)
En realidad, una forma un poco indirecta pero más lógica de lograrlo es usar MultiValueDict. De esta manera, los valores múltiples por clave se pueden almacenar en un método QueryDict y .getlist que debería funcionar bien.
from django.http.request import QueryDict, MultiValueDict
dictionary = {''my_age'': [''23''], ''my_girlfriend_age'': [''25'', ''27''], }
qdict = QueryDict('''', mutable=True)
qdict.update(MultiValueDict(dictionary))
print qdict.get(''my_age'') # 23
print qdict[''my_girlfriend_age''] # 27
print qdict.getlist(''my_girlfriend_age'') # [''25'', ''27'']
Mi solución funciona tanto para valores clave simples como múltiples:
def dict_to_querydict(dictionary):
from django.http import QueryDict
from django.utils.datastructures import MultiValueDict
qdict = QueryDict('''', mutable=True)
for key, value in dictionary.items():
d = {key: value}
qdict.update(MultiValueDict(d) if isinstance(value, list) else d)
return qdict
Python tiene una herramienta integrada para codificar un diccionario (cualquier objeto de mapeo) en una cadena de consulta
params = {''a'': ''one'', ''b'': ''two'', }
urllib.urlencode(params)
''a=one&b=two''
http://docs.python.org/2/library/urllib.html#urllib.urlencode
QueryDict
toma una cadena de consulta como primer parámetro de su constructor
def __init__(self, query_string, mutable=False, encoding=None):
q = QueryDict(''a=1&b=2'')
https://github.com/django/django/blob/master/django/http/request.py#L260
Actualización: en Python3 , urlencode se ha movido a urllib.parse :
from urllib.parse import urlencode
params = {''a'': ''one'', ''b'': ''two'', }
urlencode(params)
''a=one&b=two''