我有一个带有POST表单的页面,其动作设置为某个URL
假设此页面网址为/form_url/
:
..
/submit_url/
中的视图会处理表单数据。在此之后,我想返回带有成功消息的表单的同一页面。
在注意POST表单的视图中,我使用HttpResponseRedirect
,以便"清除"来自浏览器的表单数据。
但是通过这种方式,我无法在表单页面中显示消息,除非我执行以下操作:
return HttpResponseRedirect("/form_url/?success=1")
然后在模板中检查此参数。我不喜欢这种方式,因为如果用户刷新页面,他仍会看到成功消息。
我注意到在django管理站点中,删除/添加对象确实在POST提交后使用重定向,并且仍以某种方式显示成功消息。 怎么样?
我已经短暂地看过django" messaging"应用程序,但我想知道它是如何工作的..
答案 0 :(得分:17)
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 %}
答案 1 :(得分:5)
Django消息框架将消息存储在会话或cookie中(取决于storage backend)。
答案 2 :(得分:2)
您无需进行重定向即可清除表单数据。您需要做的就是重新实例化表单:
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上解除绑定。
如果您利用messages framework,您仍然需要在模板中添加条件以显示消息是否存在。
答案 3 :(得分:2)
对于基于类的视图,请使用self.request
我在返回中也使用了self.request.path_info
from django.contrib import messages
class MyCreateView(CreateView):
...
def form_valid(self, form):
....
self.object.save()
messages.success(self.request, 'Form submission successful')
return HttpResponseRedirect(self.request.path_info)
与damio的答案相同的模板:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li {% if message.tags %} class=" {{ message.tags }} " {% endif %}> {{ message }} </li>
{% endfor %}
</ul>
{% endif %}
答案 4 :(得分:1)
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/