Сообщение django после отправки формы POST

У меня есть страница с формой POST, у которой есть действие, установленное для некоторого URL-адреса.
Предположим, что этот URL-адрес страницы /form_url/:      ..   

Вид в /submit_url/ позаботится о данных формы. После этого я хочу вернуть ту же страницу формы с успешным сообщением. В представлении, которое берет на себя форму POST, я использую HttpResponseRedirect, чтобы "очистить" данные формы от браузера. Но таким образом я не могу отображать сообщение на странице формы, если я не сделаю что-то вроде:

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

а затем проверьте этот параметр в шаблоне. Мне это не нравится, поскольку, если пользователь обновляет страницу, он все равно увидит сообщение об успешном завершении.

Я заметил, что в админ-сайте django удаление/добавление объектов использует перенаправление после отправки POST и по-прежнему отображает сообщение об успешном завершении. Как?

Я уже кратко видел приложение для обмена сообщениями django, но я хочу знать, как он работает в первую очередь.

Ответ 1

Администратор django использует django.contrib.messages, вы используете его следующим образом:

На ваш взгляд:

from django.contrib import messages

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

И в ваших шаблонах:

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

Ответ 2

Структура сообщений Django хранит сообщения в сеансе или файле cookie (это зависит от бэкэнда хранилища).

Ответ 3

Вам не нужно делать перенаправление для очистки данных формы. Все, что вам нужно сделать, это повторно создать форму:

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

Если пользователь обновит страницу, они будут инициировать запрос GET, а success будет False. В любом случае форма будет несвязана в GET или в успешном POST.

Если вы используете структуру сообщений, вам все равно нужно добавить условное выражение в шаблон для отображения сообщений, если они существуют или нет.

Ответ 4

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/

Ответ 5

messages.success (запрос, ваша учетная запись создана! Теперь вы можете войти)