¿Cómo paso los parámetros GET usando django urlresolvers reverse


81

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 ?


4
Eche un vistazo a esa respuesta que ofrece una forma bastante agradable de hacer este tipo de cosas.
sberder

Respuestas:


149

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)

8
Esto funciona para este ejemplo. Dado que no se realiza ninguna cita, esto falla si utiliza valores que deben ser citados.
guettli

75

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 adicional getdonde puede poner sus GETparámetros en él como un diccionario.


12
Nota: la django.utils.http.urlencodefunció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/…
Dolan Antenucci

17

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'

¿Qué sentido tiene tener 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
motatoes

3
@potatoes []Son una convención de PHP.
Jonas Schäfer

-2

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('&')

1
Esto no codifica por URL el diccionario; no hay manejo de caracteres reservados de URL (por ejemplo #, ?) ni ningún tipo de codificación porcentual: en.wikipedia.org/wiki/Percent-encoding
jamesc
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.