2015-02-25 11 views
7

Ich habe eine Seite mit einem POST-Formular, die eine Aktion auf eine URL festgelegt haben.
d.h nehmen URL dieser Website ist /form_url/: .. django Display-Nachricht nach dem POST-Formular senden

Der Blick in /submit_url/ der Formulardaten kümmern. Danach möchte ich die gleiche Seite des Formulars mit einer Erfolgsmeldung zurückgeben. In der Ansicht, die auf das POST-Formular achten, verwende ich HttpResponseRedirect, um die Formulardaten aus dem Browser zu "löschen". Aber auf diese Weise kann ich eine Nachricht nicht in der Formularseite angezeigt werden, es sei denn ich etwas tun:

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

und dann in der Vorlage für diesen Parameter überprüfen. Ich mag diesen Weg nicht, denn wenn der Benutzer die Seite aktualisiert, sieht er immer noch die Erfolgsmeldung.

Ich habe festgestellt, dass in der Django Admin-Site, das Löschen/Hinzufügen von Objekten verwendet Redirect nach dem Senden POST, und immer noch eine Erfolgsmeldung angezeigt irgendwie. Wie?

Ich habe schon kurz gesehen django „Messaging“ app, aber ich möchte wissen, wie es zuerst arbeiten ..

Antwort

5

Django Nachrichten Rahmen speichert die Nachrichten in der Sitzung oder Cookie (es hängt von der storage backend).

+0

Aha. Ich dachte auch. Ich versuche dies zu tun, ohne die Sitzung zu benutzen. – user3599803

2

Sie müssen keine Umleitung zum Löschen der Formulardaten durchführen. Alles, was Sie tun müssen, ist die Form erneut instanziiert:

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

Wenn der Benutzer die Seite aktualisiert wird, dann werden sie eine GET-Anforderung zu initiieren, und successFalse sein wird. In beiden Fällen ist das Formular bei einem GET oder bei einem erfolgreichen POST nicht gebunden.

Wenn Sie die messages framework nutzen, müssen Sie noch eine Bedingung in der Vorlage hinzufügen, um die Nachrichten anzuzeigen, wenn sie vorhanden sind oder nicht.

+3

Wenn ich render() verwenden, um eine Antwort von einer Ansicht zurückzugeben, die von POST angefordert wird, wenn der Benutzer die Seite aktualisiert, wird der Browser ein Popup anzeigen, wenn das Formular erneut gesendet werden soll. Das versuche ich zu vermeiden. – user3599803

+0

Sie haben hier wirklich keine große Auswahl. Sie müssen entweder eine Umleitung ausführen und den querystring-Parameter übergeben, oder Sie müssen einen Nachrichten-/Sitzungswert verwenden. – Brandon

+0

Löscht die Django-Nachrichten-App die Sitzungsdaten, nachdem sie verwendet wurden? Da muss die Sitzung nicht gespeichert werden, nachdem ich sie angezeigt habe. – user3599803

4

Die django Admin verwendet django.contrib.messages, verwenden Sie es wie folgt aus:

Ihrer Ansicht:

from django.contrib import messages 

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

Und in Ihre Vorlagen:

{% 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/