2009-09-23 13 views
31

Ho un modulo che reindirizza alla stessa pagina dopo che un utente ha inserito le informazioni (in modo che possano continuare a immettere informazioni). Se l'invio del modulo ha esito positivo, sto restituendoCome si passano le informazioni di contesto del modello quando si utilizza HttpResponseRedirect in Django?

HttpResponseRedirect(request.path) 

che funziona bene. Tuttavia, mi piacerebbe anche visualizzare alcuni messaggi all'utente in questo caso (ad es. "I tuoi dati sono stati salvati" nella parte superiore dello schermo). Se non stavo reindirizzando, vorrei solo restituire questi messaggi nel dizionario di contesto. Con il reindirizzamento, tuttavia, non posso farlo.

Quindi, come posso passare le informazioni di contesto del modello quando si utilizza HttpResponseRedirect?

Quello che sto cercando di fare sembra essere incredibilmente comune, quindi per favore scusami se mi manca qualcosa di ovvio.

+0

sono questi gli utenti registrati? –

+0

Sembra che il caricamento della seconda pagina avvenga dopo un'altra richiesta separata dal browser (la prima risposta restituisce un 302), quindi non è possibile passare informazioni avanti e indietro tra le visualizzazioni come ci si potrebbe aspettare utilizzando HttpResponseRedirect. IMHO, il framework di sessione è il modo più semplice per passare le informazioni tra le richieste. –

risposta

5

Il modo migliore sarebbe probabilmente quello di utilizzare una querystring codificata sull'URL di reindirizzamento ... è un approccio old school.

Si potrebbe fare qualcosa di simile

/page /? M = 1,/page /? M = 2, ecc

Si potrebbe quindi analizzare quella variabile con request.GET nel codice di visualizzazione e spettacolo il messaggio appropriato.

6

Non è possibile. HttpResponseRedirect invia un reindirizzamento lato client (codice di stato HTTP 302) al browser, quindi il browser richiede nuovamente un'altra pagina.

È possibile impostare una stringa di query URL sul reindirizzamento, benché ciò sia visibile all'utente e a chiunque intercetti le richieste HTTP (ad esempio i proxy) e pertanto non è adatto per le informazioni sensibili.

+2

e il framework delle sessioni? –

0

Si aggiunge salvato = 1 per la stringa di query e verificare con qualcosa come:?

saved = request.GET.get('saved', False) 
1

L'unico modo che conosco per passare tutti i dati con un redirect è quello di aggiungere parametri GET all'URL si sta passando per evitare XSS hack che ci si vuole passare una costante specifico come:.?

[percorso attuale si sta passando in] ​​message = salvato

E poi elaborare il messaggio = parametro salvato nel gestore del percorso in cui sei passato.

Un modo un po 'più complicato non sarebbe passare i dati nel reindirizzamento e invece utilizzare qualcosa come http://code.google.com/p/django-notify/ per memorizzare i dati basati su sessione che vengono visualizzati all'utente dopo il reindirizzamento.

10

se si utilizza autenticazione e dispone di un utente collegato si potrebbe:

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.message_set.create

GET parametri sono anche hackable. La querystring, come menzionato in altre risposte, potrebbe essere utilizzata.

Penso che il modo migliore sarebbe utilizzare la struttura delle sessioni.In questo modo è possibile caricare fino quello che vuoi nel contesto e ottenere

{{ request.session.foo }} 

foo potrebbe essere il messaggio o si potrebbe fare:

{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %} 

e altre cose divertenti.

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

+0

come in request.session ['foo'] = 1? –

+0

sì, per il secondo codice modello. oppure, per il primo snippet di modello, potresti inserire l'intero messaggio in base alla logica. –

+0

Non ho mai realizzato quanto fossero facili le sessioni in Django ... Grazie per averlo suggerito. Ho fatto uso di questo metodo e funziona molto bene. – nicorellius

0

Dal vostro views.py si hai dovuto mettere una chiave/valore di coppia nella sessione e poi leggere dal modello HTML.

Ad esempio:

views.py

# your code here 
request.session['vote'] = 1 
return HttpResponseRedirect(request.path) 

your_template.html

{% ifequal request.session.vote 1 %} 
    <!-- Your action here --> 
{% endifequal %} 
+0

Una vecchia risposta, ma ho il sospetto che qualcosa del genere possa essere usato per la domanda che ho posto qui: http://stackoverflow.com/questions/41317128/using-httpresponseredirect-in-a-django-view-where-context-has -to-be-passed Mi piacerebbe sentire i tuoi pensieri su di esso se hai tempo :-) –

45

Per ragioni di completamento e riferimento futuro, è ora possibile utilizzare the messages framework. Dopo averlo installato:

views.py

from django.contrib import messages 

def view(request): 
    # your code 
    messages.success(request, "Your data has been saved!") 
    HttpResponseRedirect(request.path) 

template.html

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