wake-up-neo.com

django display message after POST Formular absenden

Ich habe eine Seite mit einem POST-Formular, für das eine Aktion auf eine URL gesetzt ist.
Das heißt, diese Seiten-URL ist /form_url/: ..

Die Ansicht in /submit_url/ kümmert sich um die Formulardaten. Danach möchte ich dieselbe Seite des Formulars mit einer Erfolgsmeldung zurückgeben. In der Ansicht, die das POST-Formular berücksichtigt, verwende ich HttpResponseRedirect, um "zu löschen". die Formulardaten vom Browser. Aber auf diese Weise kann ich keine Nachricht auf der Formularseite anzeigen, es sei denn, ich mache Folgendes:

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

Überprüfen Sie dann diesen Parameter in der Vorlage. Das gefällt mir nicht, denn wenn der Benutzer die Seite aktualisiert, wird die Erfolgsmeldung trotzdem angezeigt.

Ich habe festgestellt, dass das Löschen/Hinzufügen von Objekten auf der Django-Admin-Site nach POST Submit die Weiterleitung verwendet und trotzdem eine Erfolgsmeldung anzeigt. Wie?

Ich habe die Django "Messaging" -App bereits kurz gesehen, möchte aber zuerst wissen, wie sie funktioniert.

11
user3599803

Der Django-Administrator verwendet Django.contrib.messages, Sie verwenden es so:

Ihrer Ansicht nach:

from Django.contrib import messages

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

Und in deinen Vorlagen:

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

Das Django-Nachrichten-Framework speichert die Nachrichten in der Sitzung oder im Cookie (dies hängt vom storage-Backend ab).

5
catavaran

Sie müssen keine Weiterleitung durchführen, um die Formulardaten zu löschen. Sie müssen lediglich das Formular erneut instanziieren:

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, initiiert er eine GET-Anforderung, und success wird False sein. In beiden Fällen ist das Formular bei einem GET oder einem erfolgreichen POST ungebunden.

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

2
Brandon
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/de/1.11/ref/contrib/messages/

1
Asif