Сообщение 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 (запрос, ваша учетная запись создана! Теперь вы можете войти)