2009-03-01 16 views
20

Ho una vista che accetta l'invio di un modulo e aggiorna un modello.Come passare le informazioni utilizzando un reindirizzamento HTTP (in Django)

Dopo aver aggiornato il modello, desidero reindirizzare a un'altra pagina e desidero visualizzare in questa pagina un messaggio come "Campo X aggiornato correttamente".

Come posso "passare" questo messaggio all'altra pagina? HttpResponseRedirect accetta solo un URL. Ho visto questo fatto prima su altri siti. Come è stato realizzato?

+0

Penso che questo problema sia abbastanza comune in tutti i framework e non sia limitato a django/python. – Jiri

+3

@Jiri, sì, ma alcuni framework forniscono supporto per questo. –

+0

codifica il messaggio nella stringa di query dell'URL a cui stai reindirizzando. dovrebbe funzionare in qualsiasi contesto. –

risposta

1

Puoi semplicemente passare il messaggio come una query sull'origine del reindirizzamento? Non è terribilmente Resty, ma dovrebbe funzionare:

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

e avere quel controllo vista per un param messaggio, macchia per cattivi, e visualizzarli in alto.

12

Si tratta di una funzione integrata di Django, chiamati "messaggi"

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

Dalla documentazione:

Un messaggio è associato a un utente. Non esiste un concetto di scadenza o timestamp .

I messaggi vengono utilizzati dall'amministratore Django dopo aver eseguito correttamente le azioni. Ad esempio, "Il sondaggio Foo è stato creato con successo ". è un messaggio

+1

Questa funzione non richiede un utente autenticato? O ci sono utenti anonimi/non autenticati supportati da Django? –

+1

Non richiede un utente autenticato. L'oggetto "utente" a cui viene allegato il messaggio può essere un utente anonimo; Django crea un oggetto utente basato sulla sessione avviata per quel visitatore. L'unico requisito è che il visitatore accetti i cookie. –

+9

@Jarret e @ S.Lott sono errati. I messaggi incorporati di Django non sono basati su sessioni, sono supportati da database e sono legati a oggetti utente DB reali (l'utente "anonimo" non esiste nel DB), quindi sono utilizzabili solo con utenti autenticati. Prova django-flashcookie o django-session-messages. –

8

È possibile utilizzare django-flashcookie app http://bitbucket.org/offline/django-flashcookie/wiki/Home

può inviare più messaggi e avere un numero illimitato di tipi di messaggi. Diciamo che si desidera un tipo di messaggio per avvertimento e una per i messaggi di errore, è possibile scrivere

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 anche

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("/") 

e poi nel tuo modello mostralo con

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

o

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

Mentre tutti i suggerimenti lavoro svolto finora, vi suggerisco di andare con Ry4an di (passarlo nell'URL richiesta) - basta cambiare il testo effettivo a un testo codificato all'interno di un insieme predefinito di messaggi di testo.

due vantaggi qui:

  1. meno possibilità di qualcosa di violazione al sistema attraverso il vostro lavaggio di contenuto inappropriato
  2. È possibile localizzare i messaggi in seguito, se necessario.

Gli altri metodi relativi ai cookie .. beh, non funzionano se il browser non supporta i cookie e sono leggermente più costosi .. Ma solo leggermente. Sono davvero più puliti alla vista.

+0

Non mi piace davvero l'idea di passare i messaggi degli utenti tramite URL - distrugge solo la pulizia di Django – tutuDajuju

3

Ci sono un sacco di soluzioni

1 Utilizzare la versione Django-tronco - è supporta l'invio di messaggi a utenti anonimi

2 sessioni

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


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

3 redirect con param

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

4 biscotti

0

Si potrebbe anche avere l'url di reindirizzamento come percorso per una vista già parametrizzata.

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,))) 

Nota che args = ha bisogno di prendere una tupla.

5

Mi è piaciuta l'idea di utilizzare il framework del messaggio, ma l'esempio nella documentazione di django non funziona per me nel contesto della domanda precedente.

Quello che veramente mi infastidisce, è la linea nella documentazione 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.

che è incomprensibile per un novizio (come me) e ha bisogno di espansione su, preferibilmente con ciò che quelle 2 opzioni sembrano .

Sono stato in grado di trovare solo soluzioni che richiedevano il rendering con RequestContext ... che non risponde alla domanda di cui sopra.

Credo di aver creato una soluzione per il 2 ° delle seguenti opzioni:

Speriamo che questo vi aiuterà a qualcun altro.

== == 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 soluzione utilizzata da Pydev UA è il meno invasivo e può essere utilizzato senza modificare quasi nulla nel codice. Quando si passa il messaggio, è possibile aggiornare il contesto nella vista che gestisce il messaggio e nel modello è possibile visualizzarlo.

Ho usato lo stesso approccio, ma invece di passare un testo semplice, ho passato un dett con le informazioni in campi utili per me. Quindi, nella vista, anche il contesto aggiornato e quindi restituito il modello renderizzato con il contesto aggiornato.

Semplice, efficace e molto discreto.

1

penso che questo codice dovrebbe funzionare per voi

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

Ho letto e controllato tutte le risposte, e mi sembra che la strada da percorrere ora sta usando the messaging framework. Alcune delle risposte sono abbastanza vecchie e probabilmente sono state nel modo giusto al momento della pubblicazione.

+0

Molto utile Jan – tutuDajuju