¿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 ?

Yossi
fuente
4
Eche un vistazo a esa respuesta que ofrece una forma bastante agradable de hacer este tipo de cosas.
sberder
1
Creé
guettli

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)
Daniel Roseman
fuente
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.

Amir Ali Akbari
fuente
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'
clima
fuente
¿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('&')
Avik Samaddar
fuente
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