首页 文章

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

提问于
浏览
10

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

/submit_url/ 中的视图处理表单数据 . 在此之后,我想返回带有成功消息的表单的同一页面 . 在关注POST表单的视图中,我使用 HttpResponseRedirect ,以便从浏览器中获取表单数据 . 但是这样我就无法在表单页面中显示消息,除非我做了类似的事情:

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

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

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

我已经简要地看过django“messaging”应用程序,但我想知道它是如何工作的......

4 回答

  • 12

    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

    Django消息框架将消息存储在会话或cookie中(取决于storage backend) .

  • 5

    您无需执行重定向即可清除表单数据 . 您需要做的就是重新实例化表单:

    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,您仍然需要在模板中添加条件以显示消息(如果存在或不存在) .

  • 2
    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/

相关问题