urls - ¿Cómo paso los parámetros GET usando django urlresolvers reverse
django urls (4)
Estoy usando django 1.2 y yendo de una vista a otra usando el método inverso de urlresolvers.
url = reverse(viewOne)
y quiero pasar un parámetro get, por ejemplo
name = ''joe''
para que en la vista Uno si lo hago
def viewOne(request):
request.GET[''name'']
Conseguiré
joe
Cómo puedo hacer eso ?
Esto es muy similar a la solución de Amir pero maneja las listas también.
from django.core.urlresolvers import reverse
from django.http import QueryDict
def build_url(*args, **kwargs):
params = kwargs.pop(''params'', {})
url = reverse(*args, **kwargs)
if not params: return url
qdict = QueryDict('''', mutable=True)
for k, v in params.iteritems():
if type(v) is list: qdict.setlist(k, v)
else: qdict[k] = v
return url + ''?'' + qdict.urlencode()
Ejemplo de uso:
>>> build_url(''member-list'', params={''format'': ''html'', ''sex'': [''male'', ''female'']})
u''/members/?format=html&sex=male&sex=female''
Los parámetros GET no tienen nada que ver con la URL devuelta por reverse
. Solo agrégalo al final:
url = "%s?name=joe" % reverse(viewOne)
Perdón por la corrección retrasada en esto.
Si bien las dos respuestas manejan muy bien la tarea requerida, creo que una simple función para urlencodear un diccionario es la forma más flexible de hacerlo:
import urllib
def getify(dic):
st = ''''
for K, V in dic.items():
K = urllib.parse.quote(str(K))
if isinstance(V, list):
for v in V:
st += K + ''='' + urllib.parse.quote(str(v)) + ''&''
else:
st += K + ''='' + urllib.parse.quote(str(V)) + ''&''
return st.rstrip(''&'')
Una manera más segura y más flexible:
import urllib
from django.core.urlresolvers import reverse
def build_url(*args, **kwargs):
get = kwargs.pop(''get'', {})
url = reverse(*args, **kwargs)
if get:
url += ''?'' + urllib.urlencode(get)
return url
entonces puedes usar build_url
:
url = build_url(''view-name'', get={''name'': ''joe''})
que toma los mismos argumentos que en reverse
, pero proporciona un argumento de palabra clave adicional donde puede poner sus parámetros GET
como un diccionario.