working with not httpresponseredirect example context python django redirect parameter-passing

python - with - return render django view



Django return redirect() con parĂ¡metros (2)

En mi función de vista, quiero llamar a otra vista y pasarle datos:

return redirect(''some-view-name'', backend, form.cleaned_data)

, donde backend es del objeto registration.backends, y form.cleaned_data es un dict de datos del formulario (pero ambos deben enviarse como * args o ** kwargs para evitar que se levante Don''t mix *args and **kwargs in call to reverse()! error). De lo que he encontrado en los documentos:

def my_view(request): ... return redirect(''some-view-name'', foo=''bar'')

Parece que necesito proporcionar el argumento ''some-view-name'', pero ¿es solo el nombre de la función de vista, o el nombre de la url? Así que me gustaría que sea similar a la forma en que se hace en django-registration, donde:

to, args, kwargs = backend.post_registration_redirect(request, new_user) return redirect(to, *args, **kwargs) def post_registration_redirect(self, request, user): return (''registration_complete'', (), {})

Ok, entonces ahora, ¿puedo llamar directamente a mi función de vista o necesito proporcionar una url para ello? Y, lo que es más importante, ¿cómo se verá mi llamada de funciotn (y una URL si es necesario)? Tanto el backend como los clean_data se pasan a través de esta vista para un uso posterior. Lo intenté, pero es incorrecto:

url(r''^link/$'', some-view-name) def some-view-name(request, *args):

Tan bien como esto :

return redirect(''some_url'', backend=backend, dataform.cleaned_data) url(r''^link/$'', some-view-name) def some-view-name(request, backend, data):

todavía NoReverseMatch. Pero en django-registration, he visto algo como esto:

url(r''^register/$'',register,{''backend'': ''registration.backends.default.DefaultBackend''}, name=''registration_register''), def register(request, backend, success_url=None, form_class=None, disallowed_url=''registration_disallowed'', template_name=''user/login_logout_register/registration_form.html'', extra_context=None):


En primer lugar, su definición de URL no acepta ningún parámetro en absoluto. Si desea que los parámetros pasen de la URL a la vista, debe definirlos en urlconf.

En segundo lugar, no está del todo claro qué es lo que espera que suceda con el diccionario de clean_data. No olvides que no puedes redireccionar a un POST, esto es una limitación de HTTP, no de Django, por lo que tu clean_data necesita ser un parámetro de URL (horrible) o, ligeramente mejor, una serie de parámetros GET, por lo que la URL estaría en la forma:

/link/mybackend/?field1=value1&field2=value2&field3=value3

y así. En este caso, campo1, campo2 y campo3 no se incluyen en la definición de URLconf; están disponibles en la vista a través de request.GET .

Entonces tu urlconf sería:

url(r''^link/(?P<backend>/w+?)/$'', my_function)

y la vista se vería así:

def my_function(request, backend): data = request.GET

y lo contrario sería (después de importar urllib ):

return "%s?%s" % (redirect(''my_function'', args=(backend,)), urllib.urlencode(form.cleaned_data))

Editado después del comentario

El objetivo de usar el redireccionamiento y el reverso, como lo ha estado haciendo, es que vaya a la URL: devuelve un código Http que hace que el navegador redireccione a la nueva URL y la llame.

Si simplemente desea llamar a la vista desde su código, simplemente hágalo directamente, sin necesidad de utilizar el comando reverse.

Dicho eso, si todo lo que quiere hacer es almacenar los datos, simplemente colóquelos en la sesión:

request.session[''temp_data''] = form.cleaned_data


urls.py:

#... url(r''element/update/(?P<pk>/d+)/$'', ''element.views.element_update'', name=''element_update''),

views.py:

from django.shortcuts import redirect from .models import Element def element_info(request): # ... element = Element.object.get(pk=1) return redirect(''element_update'', pk=element.id) def element_update(request, pk) # ...