2010-09-02 7 views
42

Tengo una vista que valida y guarda un formulario. Después de guardar el formulario, me gustaría redireccionar a una vista de lista de proyectos con un mensaje de éxito "el formulario para el cliente xyz se actualizó correctamente ..."¿Cómo redirecciono en Django con contexto?

HttpResponseRedirect no parece que funcione, porque solo tiene un argumento para la url, no hay manera de pasar diccionario con ella.

He intentado modificar mi contenedor para object_list para tomar un dict como parámetro que tiene el contexto necesario. Devuelvo una llamada a este contenedor desde el interior de la vista que guarda el formulario. Sin embargo, cuando se procesa la página, la url es '/ customer_form /' en lugar de '/ list_customers /'. Traté de modificar el objeto de solicitud, antes de pasarlo al contenedor object_list, pero eso no funcionó.

Gracias.

+7

Nota para los buscadores futuros: asegúrese de leer más allá de la respuesta aceptada, ya que ahora está en desuso. –

Respuesta

19

Tenga en cuenta la respuesta sugiere aquí sólo es aplicable a Django < 1.2:

¿Tiene control sobre la opinión de que van a redirigirse a? En ese caso, puede guardar el contexto en la sesión antes de redireccionar. La vista objetivo puede recoger el contexto (y eliminarlo) de la sesión y usarlo para representar la plantilla.

Si su único requisito es mostrar un mensaje, entonces hay una mejor manera de hacerlo. Su primera vista puede crear un mensaje para el actual usando auth y tener la segunda vista leída y eliminada. Algo como esto:

def save_form(request, *args, **kwargs): 
    # all goes well 
    message = _("form for customer xyz was successfully updated...") 
    request.user.message_set.create(message = message) 
    return redirect('list_view') 

def list_view(request, *args, **kwargs): 
    # Render page 

# Template for list_view: 
{% for message in messages %} 
    ... 
{% endfor %} 

Los mensajes se guardan en la base de datos. Esto significa que puede acceder a ellos incluso después de una redirección. Se leen automáticamente y borrados en la representación de la plantilla. Deberá usar RequestContext para que esto funcione.

Para Django => 1,2 leer la respuesta que implica mensajes

+7

La otra respuesta probablemente debería ser aceptada como la respuesta correcta ahora. Esto fue desaprobado en django 1.2 y eliminado en django 1.4 (como se menciona en la otra respuesta). –

57

request.user.message_set desfasada y en Django 1.2 y se ha quitado desde Django 1.4, la message framework debe usarse en su lugar.

from django.contrib import messages 

# messages.add_message(request, level, message, extra_tags='', fail_silently=False) 
messages.add_message(request, messages.INFO, "Your Message") 

Los mensajes pueden ser prestados en la plantilla con:

{% if messages %} 
    <ul class="messages"> 
     {% for message in messages %} 
      <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
     {% endfor %} 
    </ul> 
{% endif %} 
6

Para ampliar respuesta es útil de Antoine: si desea procesar los mensajes en su módulo de puntos de vista, en lugar de la plantilla:

from django.contrib.messages import get_messages 

def my_view(request): 
    # Process your form data from the POST, or whatever you need to do 

    # Add the messages, as mentioned above 
    messages.add_message(request, messages.INFO, form.cleaned_data['name']) 

    return HttpResponseRedirect('/other_view_url/') 

def other_view(request): 
    storage = get_messages(request) 
    name = None 
    for message in storage: 
     name = message 
     break 
    return render(request, 'general/other_view.html', {'name': name}) 
Cuestiones relacionadas