POST表单提交后,django显示消息

时间:2015-02-25 15:44:09

标签: django forms post message

我有一个带有POST表单的页面,其动作设置为某个URL 假设此页面网址为/form_url/:          ..     

/submit_url/中的视图会处理表单数据。在此之后,我想返回带有成功消息的表单的同一页面。 在注意POST表单的视图中,我使用HttpResponseRedirect,以便"清除"来自浏览器的表单数据。 但是通过这种方式,我无法在表单页面中显示消息,除非我执行以下操作:

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

然后在模板中检查此参数。我不喜欢这种方式,因为如果用户刷新页面,他仍会看到成功消息。

我注意到在django管理站点中,删除/添加对象确实在POST提交后使用重定向,并且仍以某种方式显示成功消息。 怎么样?

我已经短暂地看过django" messaging"应用程序,但我想知道它是如何工作的..

5 个答案:

答案 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/