django redirect () con parámetros

Ya se han hecho varias preguntas similares, pero no pude encontrar respuesta a mi problema después de pasar largas horas.

En el código a continuación, cuando redirijo a “anotherView” desde “myView” con el parámetro “username”, funciona bien como se esperaba. Pero también debo incluir el parámetro “rango” en este redireccionamiento, ya que este “rango” es necesario para la plantilla utilizada después del redireccionamiento. Cada vez que bash hacerlo, obtengo varios errores como:

– “No mezclar * args y ** kwargs en call to reverse ()”

¿Hay una manera de manejar esto de la manera que quiero?

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) 

redirect es simplemente un envoltorio alrededor de HttpResponseRedirect que automáticamente reverse para que usted cree la URL a la que redirigir. Como resultado, los parámetros que le pasa, no son arbitrarios, deben ser iguales a los que reverse y, específicamente, solo los 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 un sentido 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 nuevo al servidor, y el servidor la usa para buscar los datos y dar la apariencia de estado.

Como resultado, si necesita que los datos de una vista estén disponibles en otra, debe agregarlos a la sesión, hacer su redirección y buscar los datos en la sesión de la siguiente vista.

En lugar de redirigir a la URL de destino, simplemente llame directamente a la función de vista de destino:

 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) 

¿A qué estás tratando de pasarle la variable “rango”? ¿Otra vista? No hay ningún parámetro para aceptarlo. Creo que puedes estar buscando la función reverse () , pero es difícil decirlo.

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

Puedes probar algo como:

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

Eso te permitirá pasarle más atributos.

Editar

¿Qué tal esto en la vista original:

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