2015-02-25 14 views
7

Ho una pagina con un modulo POST, che ha un'azione impostata su qualche URL.
cioè assumere indirizzo di questa pagina è /form_url/: .. messaggio di visualizzazione django dopo il modulo POST inviare

La vista in /submit_url/ prendersi cura dei dati del modulo. Dopo questo, voglio restituire la stessa pagina del modulo con un messaggio di successo. Nella vista che si occupa del modulo POST, utilizzo HttpResponseRedirect, per "cancellare" i dati del modulo dal browser. Ma in questo modo non riesco a visualizzare un messaggio nella pagina del modulo, a meno che non fare qualcosa di simile:

return HttpResponseRedirect("/form_url/?success=1") 

e quindi verificare la presenza di questo parametro nel modello. Non mi piace in questo modo, poiché se l'utente aggiorna la pagina, vedrà comunque il messaggio di successo.

Ho notato che nel sito admin di django, l'eliminazione/aggiunta di oggetti utilizza il reindirizzamento dopo l'invio POST e mostra comunque un messaggio di successo in qualche modo. Come?

ho già brevemente visto Django "Messaggi" app, ma voglio sapere come funziona prima ..

risposta

5

Django messaggi quadro memorizza i messaggi nella sessione o cookie di (dipende dal storage backend).

+0

Io vedo. Così ho pensato. Sto cercando di farlo senza usare la sessione. – user3599803

2

Non è necessario eseguire un reindirizzamento per cancellare i dati del modulo. Tutto quello che devi fare è ri-creare un'istanza del modulo:

def your_view(request): 
    form = YourForm(request.POST or None) 
    success = False 
    if request.method == 'POST': 
     if form.is_valid(): 
      form.save() 
      form = YourForm() 
      success = True 
    return render(request, 'your_template.html', {'form': form}) 

Se l'utente aggiorna la pagina, si sta andando ad avviare una richiesta GET, e success saranno False. In entrambi i casi, il modulo non sarà associato a un GET o a un POST di successo.

Se si utilizza lo messages framework, sarà comunque necessario aggiungere un condizionale nel modello per visualizzare i messaggi, se presenti o meno.

+3

Se utilizzo render() per restituire una risposta da una vista che è stata reimpostata dal POST, se l'utente aggiorna la pagina il browser chiederà un popup se inviare nuovamente il modulo. Questo è quello che sto cercando di evitare. – user3599803

+0

Qui non hai molta scelta. È necessario emettere un reindirizzamento e passare il parametro querystring oppure è necessario utilizzare un valore messaggio/sessione. – Brandon

+0

L'app del messaggio django cancella i dati della sessione dopo che è stata utilizzata? Poiché non è necessario salvare la sessione dopo che l'ho visualizzata. – user3599803

4

L'amministratore Django utilizza django.contrib.messages, si utilizza in questo modo:

Secondo lei:

from django.contrib import messages 

def my_view(request): 
    ... 
     if form.is_valid(): 
      .... 
      messages.success(request, 'Form submission successful') 

E nei template:

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
0
from django.contrib.messages.views import SuccessMessageMixin 
from django.views.generic.edit import CreateView 
from myapp.models import Author 

class AuthorCreate(SuccessMessageMixin, CreateView): 
    model = Author 
    success_url = '/success/' 
    success_message = "%(name)s was created successfully" 

https://docs.djangoproject.com/en/1.11/ref/contrib/messages/

Problemi correlati