Estoy usando django 1.2 y voy de una vista a otra usando el método inverso urlresolvers.
url = reverse(viewOne)
y quiero pasar un parámetro de obtención, por ejemplo
nombre = 'joe'
para que en la vista uno si lo hago
def viewOne(request):
request.GET['name']
Voy a conseguir
joe
Cómo puedo hacer eso ?
Respuestas:
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)
fuente
Una forma más segura y flexible:
import urllib from django.urls 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
reverse
, pero proporciona un argumento de palabra clave adicionalget
donde puede poner susGET
parámetros en él como un diccionario.fuente
django.utils.http.urlencode
función de Django podría ser preferible ya que es una "versión de la función urllib.urlencode () de Python que puede operar en una cadena unicode": docs.djangoproject.com/en/1.10/ref/utils/…Esto es muy similar a la solución de Amir pero también maneja listas.
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()
Uso de ejemplo:
>>> build_url('member-list', params={'format': 'html', 'sex': ['male', 'female']}) u'/members/?format=html&sex=male&sex=female'
fuente
sex=male&sex=female
? Creo que debería ser&sex[]=female&sex[]=female
(tenga en cuenta lo adicional[]
), para ser una matriz de solicitud GET[]
Son una convención de PHP.Perdón por la corrección retrasada en esto.
Si bien ambas respuestas aquí manejan la tarea requerida demasiado bien, creo que solo una función simple para codificar un diccionario es la forma más flexible de hacer esto:
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('&')
fuente
#
,?
) ni ningún tipo de codificación porcentual: en.wikipedia.org/wiki/Percent-encoding