2009-03-01 78 views
20

Tengo una vista que acepta un envío de formulario y actualiza un modelo.Cómo pasar información usando un redireccionamiento HTTP (en Django)

Después de actualizar el modelo, deseo redireccionar a otra página, y quiero que aparezca en esta página un mensaje como "Campo X correctamente actualizado".

¿Cómo puedo "pasar" este mensaje a la otra página? HttpResponseRedirect solo acepta un URL. He visto esto hecho anteriormente en otros sitios. ¿Cómo se logra esto?

+0

creo que este problema es bastante común en todos los marcos y no se limita a Django/Python. – Jiri

+3

@Jiri, sí, pero algunos marcos proporcionan soporte para ello. –

+0

codificar el mensaje en la cadena de consulta de la dirección URL está redirigiendo a. debería funcionar en cualquier marco. –

Respuesta

1

¿Puede pasar el mensaje como un parámetro de consulta en la URL a la que está redireccionando? No es terriblemente resty, pero se debe trabajar;

return HttpResponseRedirect('/polls/%s/results/?message=Updated" % p.id) 

y tener esa visión de verificación para un parámetro del mensaje, fregar por desagradables, y mostrarlo en la parte superior.

12

Esta es una característica integrada de Django, llamados "mensajes"

Ver http://docs.djangoproject.com/en/dev/topics/auth/#messages

De la documentación:

Un mensaje está asociado con un usuario. No hay ningún concepto de caducidad o marcas de tiempo.

Los mensajes son utilizados por el administrador de Django después de acciones exitosas. Por ejemplo, "La encuesta Foo se creó correctamente". es un mensaje

+1

¿Esta característica no requiere un usuario autenticado? ¿O hay usuarios anónimos/no autenticados compatibles con Django? –

+1

No requiere un usuario autenticado. El objeto 'usuario' al que se adjunta el mensaje puede ser un usuario anónimo; django crea un objeto de usuario basado en la sesión iniciada para ese visitante. El único requisito es que su visitante permita las cookies. –

+9

@Jarret y @ S.Lott están equivocados. Mensajes incorporadas de Django no están basadas en sesiones, que son la base de datos respaldados y atado en objetos reales de los usuarios de base de datos (el usuario "anónimo" no existe en la base de datos), por lo que sólo pueden utilizarse con los usuarios autenticados. Pruebe django-flashcookie o django-session-messages. –

8

Puede usar aplicación django-flashcookie http://bitbucket.org/offline/django-flashcookie/wiki/Home

puede enviar varios mensajes y tienen tipos ilimitados de mensajes. Digamos que usted desea un tipo de mensaje de advertencia y una para mensajes de error, puede escribir

def simple_action(request): 
    ... 
    request.flash['notice'] = 'Hello World' 
    return HttpResponseRedirect("/") 

o

def simple_action(request): 
    ... 
    request.flash['error'] = 'something wrong' 
    return HttpResponseRedirect("/") 

o

def simple_action(request): 
    ... 
    request.flash['notice'] = 'Hello World' 
    request.flash['error'] = 'something wrong' 
    return HttpResponseRedirect("/") 

o incluso

def simple_action(request): 
    ... 
    request.flash['notice'] = 'Hello World' 
    request.flash['notice'] = 'Hello World 2' 
    request.flash['error'] = 'something wrong' 
    request.flash['error'] = 'something wrong 2' 
    return HttpResponseRedirect("/") 

y luego en tu plantilla muéstralo con

{% for message in flash.notice %} 
    {{ message }} 
{% endfor }} 

o

{% for message in flash.notice %} 
    {{ message }} 
{% endfor }} 
{% for message in flash.error %} 
    {{ message }} 
{% endfor }} 
0

Mientras que todas las sugerencias trabajo hasta ahora, sugeriría ir con Ry4an de (pasarlo en la URL de solicitud) - apenas cambie el texto real de un texto codificado dentro de un conjunto predefinido de mensajes de texto.

dos ventajas: aquí

  1. Menos posibilidad de que algo piratería a través de su lavado de contenido perjudicial
  2. Puede localizar sus mensajes más tarde si es necesario.

Los otros métodos relacionados con cookies ... bueno, no funcionan si el navegador no admite cookies, y son un poco más caros ... Pero solo ligeramente. De hecho, son más limpios a la vista.

+0

Realmente no me gusta la idea de transmitir mensajes de usuario a través de URL - sólo destruye la limpieza de Django – tutuDajuju

3

Hay una gran cantidad de soluciones

1 Utilice la versión de Django-tronco - se admite el envío de mensajes a los usuarios anónimos

2 Sesiones

def view1(request): 
    request.session['message'] = 'Hello view2!' 
    return HttpResponseRedirect('/view2/') 


def view2(request): 
    return HttpResponse(request.session['message']) 

3 redirección con el parámetro

return HttpResponseRedirect('/view2/?message=Hello+view2') 

4 cookies

0

También podría hacer que la URL de redirección sea la ruta a una vista ya parametrizada.

urls.py:

(r'^some/path/(?P<field_name>\w+)/$', direct_to_template, 
    {'template': 'field_updated_message.html', 
    }, 
    'url-name' 
), 

views.py:

HttpResponseRedirect(reverse('url-name', args=(myfieldname,))) 

Tenga en cuenta que args = necesita tomar una tupla.

5

Me gustó la idea de utilizar el marco de mensaje, pero el ejemplo en la documentación de django no funciona para mí en el contexto de la pregunta anterior.

Lo que realmente me molesta, es la línea en la documentación de Django:

If you're using the context processor, your template should be rendered with a RequestContext. Otherwise, ensure messages is available to the template context.

que es incomprensible para un novato (como yo) y necesita amplió, de preferencia con lo que esas 2 opciones parecen .

Solo pude encontrar soluciones que requerían renderización con RequestContext ... que no responde a la pregunta anterior.

Creo que he creado una solución para la segunda opción a continuación:

Esperamos que esto ayudará a alguien más.

== == urls.py

from django.conf.urls.defaults import * 
from views import * 

urlpatterns = patterns('', 
    (r'^$', main_page, { 'template_name': 'main_page.html', }, 'main_page'), 
    (r'^test/$', test), 

== == viewtest.py

from django.contrib import messages 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 

def test(request): 
    messages.success(request, 'Test successful') 
    return HttpResponseRedirect(reverse('main_page')) 

== viewmain.== py

from django.contrib.messages import get_messages 
from django.shortcuts import render_to_response 

def main_page(request, template_name): 
    # create dictionary of items to be passed to the template 
    c = { messages': get_messages(request) } 

    # render page 
    return render_to_response(template_name, c,) 

main_page.html == ==

{% block content %} 
    {% if messages %} 
    <div> 
     {% for message in messages %} 
      <h2 class="{{message.tag}}">{{ message.message }}</h2> 
     {% endfor %} 
    </div> 
    {% endif %} 
{% endblock %} 
0

La solución utilizada por PyDev UA es la menos intrusiva y se puede utilizar sin necesidad de modificar casi nada en el código. Cuando pasa el mensaje, puede actualizar su contexto en la vista que maneja el mensaje y en su plantilla puede mostrarlo.

que utiliza el mismo enfoque, pero en lugar de pasar un texto simple, pasó un diccionario con la información de campos útiles para mí. Luego, en la vista, actualice el contexto también y luego devuelva la plantilla renderizada con el contexto actualizado.

simple, eficaz y muy discreto.

1

creo que este código debe trabajar para usted

request.user.message_set.create(message="This is some message") 
return http.HttpResponseRedirect('/url') 
4

He leído y revisado todas las respuestas, y me parece que el camino a seguir ahora está utilizando the messaging framework. Algunas de las respuestas son bastante antiguas y probablemente hayan sido las correctas en el momento de la publicación.

+0

muy útil Ene – tutuDajuju

Cuestiones relacionadas