2012-03-06 44 views
56

estoy usando django 1.2 y yendo de una vista a otra usando el método inverso urlresolvers.Cómo paso los parámetros GET usando django urlresolvers reversa

url = reverse(viewOne) 

y quiero pasar un parámetro GET, por ejemplo

name = 'Joe'

para que en el viewOne si lo hago

def viewOne(request): 
    request.GET['name'] 

Obtendré

joe 

¿cómo hago eso?

+4

Tome un vistazo a [la respuesta] (http://stackoverflow.com/a/5341769/301373) que ofrece una manera bastante agradable de hacer este tipo de cosas. – sberder

+1

Creé una solicitud de función: https://code.djangoproject.com/ticket/25582 – guettli

Respuesta

103

Los parámetros GET no tienen nada que ver con la URL devuelta por reverse. Sólo tiene que añadir que en al final:

url = "%s?name=joe" % reverse(viewOne) 
+4

Esto funciona para este ejemplo. Debido a que no se realizan cotizaciones, esto falla si usa valores que necesitan ser cotizados. – guettli

57

Una forma 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 

continuación, puede utilizar build_url:

url = build_url('view-name', get={'name': 'joe'}) 

que toma mismos argumentos que reverse, pero proporciona un argumento de palabra clave adicional get donde puede poner sus parámetros GET en él como un diccionario.

+4

Nota: la función 'django.utils.http.urlencode' 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 ": https://docs.djangoproject.com/en /1.10/ref/utils/#django.utils.http.urlencode –

13

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' 
+0

¿Cuál es el punto de tener 'sex = male & sex = female'? Creo que debería ser '& sex [] = female & sex [] = female' (observe el adicional' [] '), para ser un array de solicitud GET – potatoes

+1

@potatoes Los' '[]' 'son una convención de PHP. –

-2

Lo siento por la corrección en diferido en esto.

Mientras tanto las respuestas aquí se encarga de la tarea requerida demasiado bien, creo que sólo una simple función de urlencode 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('&') 
+0

Esto no * url incluye url código en el diccionario; no se manejan los caracteres reservados de URL (por ejemplo, '#', '?') O cualquier tipo de codificación porcentual: https://en.wikipedia.org/wiki/Percent-encoding – jamesc

Cuestiones relacionadas