2010-09-22 7 views
39

¿Es posible agregar variables GET en una redirección? (Sin tener que modifiy mi urls.py)add request.GET variable usando django.shortcuts.redirect

Si hago redirect('url-name', x)

me sale HttpResponseRedirect('/my_long_url/%s/', x)

no tengo queja usando HttpResponseRedirect('/my_long_url/%s/?q=something', x) lugar, pero sólo me preguntaba ...

+0

pequeño error en la respuesta de Manoj Govindan: params = urllib.urlencode (** kwargs) necesita ser reemplazado con params = urllib.urlencode (kwargs) De lo contrario, obtendrá "TypeError: urlencode() obtuvo un argumento de palabra clave inesperado" – Max

Respuesta

35

Is possible to add GET variables in a redirect ? (Without having to modifiy my urls.py)

No sé de ninguna manera para hacer esto sin modificando el urls.py.

I don't have complains using HttpResponseRedirect('/my_long_url/%s/?q=something', x) instead, but just wondering...

Es posible que desee escribir un envoltorio delgado para que sea más fácil. Decir, custom_redirect

def custom_redirect(url_name, *args, **kwargs): 
    from django.core.urlresolvers import reverse 
    import urllib 
    url = reverse(url_name, args = args) 
    params = urllib.urlencode(kwargs) 
    return HttpResponseRedirect(url + "?%s" % params) 

Esto entonces se puede llamar desde su punto de vista. Por ej.

return custom_redirect('url-name', x, q = 'something') 
# Should redirect to '/my_long_url/x/?q=something' 
+2

+1 Solución elegante, gracias. – juanefren

+0

Debe ser params = urllib.urlencode (kwargs) – Regneel

+2

En Python 3, use 'urllib.parse.urlencode' –

91

Desde redirección sólo devuelve un objeto HttpResponseRedirect, que sólo podría alterar eso:

response = redirect('url-name', x) 
response['Location'] += '?your=querystring' 
return response 
+0

+1 Solución rápida que funciona, gracias. – juanefren

+0

Esto no funcionará para las URL con anclajes. – Kolyunya

+0

Lo suficientemente fácil de usar 'urldefrag' si eso es una posibilidad. Gracias por señalar el error potencial si tiene un ancla en su respuesta de url. – SmileyChris