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)
对于基于类的视图使用 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)
您不需要执行重定向来清除表单数据。您需要做的就是重新实例化表单:
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 请求,并且success将False. 无论哪种方式,表单都将在 GET 或成功的 POST 时解除绑定。
如果您利用消息框架,您仍然需要在模板中添加一个条件来显示消息(无论它们是否存在)。
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/