2012-02-28 53 views
7

Ya se han formulado varias preguntas similares, pero no he podido encontrar la respuesta a mi problema después de haber pasado muchas horas.django redirect() con los parámetros

En el siguiente código cuando me redirige a "otra Vista" desde "myView" con el parámetro "nombre de usuario", funciona bien como se esperaba. Pero también necesito incluir el parámetro "rango" en esta redirección ya que este "rango" es necesario para la plantilla utilizada después de la redirección. Cada vez que trato de hacer, consigo varios errores como:

- "No mezcle args * y ** kwargs en llamada a la inversa()"

¿Hay una manera de manejar esto de la manera I ¿querer?

def myView(request): 
     if request.user.is_authenticated(): 
     if request.method == 'POST': 
       #my code comes here 
       .... 
       return redirect('anotherView', username=request.user.username, {"range": range(int(layout))}) 



    def anotherView(request,username): 
     if request.user.is_authenticated(): 
     #my code comes here 
      .... 
      return redirect(something) 

Respuesta

20

redirect es simplemente un contenedor alrededor de HttpResponseRedirect que automáticamente llama al reverse para que usted cree la URL a la que se debe redirigir. Como resultado, los parámetros que le pasa, no son arbitrarios, deben ser los mismos que pasaría al reverse y, específicamente, solo aquellos necesarios para crear la URL.

Muchas personas parecen tener problemas para entender que los datos no se pueden pasar arbitrariamente a una vista. HTTP es un protocolo sin estado: cada solicitud existe por sí misma, como si el usuario nunca hubiera estado en ninguna otra página del sitio. El concepto de una sesión se creó para proporcionar una sensación de "estado" a una unidad cohesiva, como un sitio. Con las sesiones, los datos se almacenan en alguna forma de almacenamiento persistente y una "clave" para buscar los datos que se le entregan al cliente (generalmente el navegador del usuario). En la carga de la página siguiente, el cliente envía la clave de regreso al servidor y el servidor la usa para buscar los datos y darle la apariencia de estado.

Como resultado, si necesita datos de una vista disponible en otra, necesita agregarla a la sesión, hacer su redirección y buscar los datos en la sesión desde la vista siguiente.

+0

gracias por el diferente punto de vista. Podría usar de esta manera para resolver el problema de alguna manera. – mco

+1

¡Genial! Y aquí está la documentación de Django sobre las sesiones: https://docs.djangoproject.com/en/1.5/topics/http/sessions/ –

+0

No puedo editar el comentario sobre las sesiones por @ Régis B., pero la versión 1.5 ahora da un 404. Aquí está 1.11. https://docs.djangoproject.com/en/1.11/topics/http/sessions/ – LOlliffe

0

redirección toma el nombre de la vista para redirigir a, y cualquier atributo que se pasa a la otra vista. En su caso, anotherView solo tiene dos parámetros: solicitud y nombre de usuario; sin embargo, en el redireccionamiento, le está pasando más información.

Usted puede intentar algo como:

def anotherView(request, username, *args, **kwargs): 
    ... 

Eso le permitirá pasar más atributos a la misma.

Editar

¿Qué hay de esto en la vista original:

kwargs = {"range": range(int(layout))} 
return redirect('anotherView', username=request.user.username, **kwargs) 
+0

Me pone "arg no de palabras clave después de arg palabra clave" o "No mezcle args * y ** kwargs en call to reverse() "aún errores incluso si agrego * args, ** kwargs – mco

+0

compruebe la respuesta actualizada – miki725

+0

aún no error, pero diferente. esta vez redirigir no puede encontrar la vista "anotherView", por lo que se muestra "URL no found error" – mco

0

¿Qué está tratando de pasar el "rango" variable? ¿Otra vista? No hay parámetro para aceptarlo. Creo que puede estar buscando la función reverse(), pero es difícil de decir.

+0

variable de "rango" se usa en la plantilla de otra Vista. Quiero decir cuando la nueva plantilla se carga después de la redirección, necesito rango allí. Pero no quiero poner la variable "rango" en la URL, es por eso que no lo puse como un parámetro de la vista "otra vista". Espero estar claro? – mco

+0

No tiene que estar en la URL, pero necesitará alguna forma de aceptar esa variable en los parámetros de otra Vista, ya sea al especificarla o al usar * args, ** kwargs como sugiere miki725. – Tom

2

En lugar de volver a dirigir a la URL de destino, sólo tiene que llamar a la vista de destino función directa:

def myView(request): 
    if request.user.is_authenticated(): 
     if request.method == 'POST': 
      #my code comes here 
      .... 
      return anotherView(request, username, range) 



def anotherView(request,username,range): 
    if request.user.is_authenticated(): 
     #my code comes here 
     .... 
     return HttpResponse(something) 
+2

¿Por qué se ha bajado este valor? – Niklas

+5

Downvoted b/c si lo haces así y alguien pulsa el botón de actualización, tus datos se vuelven a publicar, lo cual es una práctica deficiente. – mikeb