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

use*_*803 16 forms django post message

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

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

return HttpResponseRedirect("/form_url/?success=1")
Run Code Online (Sandbox Code Playgroud)

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

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

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

dam*_*mio 22

django管理员使用django.contrib.messages,你这样使用它:

在你看来:

from django.contrib import messages

def my_view(request):
    ...
       if form.is_valid():
          ....
          messages.success(request, 'Form submission successful')
Run Code Online (Sandbox Code Playgroud)

在您的模板中:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li  {% if message.tags %} class=" {{ message.tags }} " {% endif %}> {{ message }} </li>
    {% endfor %}
</ul>
{% endif %}
Run Code Online (Sandbox Code Playgroud)


Bre*_*lfe 6

对于基于类的视图使用 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)
Run Code Online (Sandbox Code Playgroud)

与 damio 的答案相同的模板:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li  {% if message.tags %} class=" {{ message.tags }} " {% endif %}> {{ message }} </li>
    {% endfor %}
</ul>
{% endif %}
Run Code Online (Sandbox Code Playgroud)


cat*_*ran 5

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


Bra*_*don 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})
Run Code Online (Sandbox Code Playgroud)

如果用户刷新页面,他们将发起 GET 请求,并且successFalse. 无论哪种方式,表单都将在 GET 或成功的 POST 时解除绑定。

如果您利用消息框架,您仍然需要在模板中添加一个条件来显示消息(无论它们是否存在)。

  • 如果我使用 render() 从 POST 请求的视图返回响应,那么如果用户刷新页面,浏览器将提示弹出窗口是否再次发送表单。这就是我试图避免的。 (4认同)

Asi*_*sif 5

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"
Run Code Online (Sandbox Code Playgroud)

https://docs.djangoproject.com/en/1.11/ref/contrib/messages/