request.session.flash() 和 .pop_flash()
每当我提交一个表单时,我都会显示错误信息。不过,我添加这些信息到队列的方式有点问题,导致有些信息在我提交表单后还留着,而有些则消失了。我发现这是因为我添加信息到队列的方式不对。
正常情况下,添加信息的方法是这样的:
post_data = request.POST
if 'submit' in post_data:
... function(post_data) ...
if ...:
request.session.flash(u'This is some error message')
request.session.flash(u'Maybe some other error message')
在mako文件中:
<html>...<body>...
% for m in request.session.pop_flash():
<div class="alert-message">
<p>${m}</p>
</div>
% endfor
...</body></html>
但是,我希望有些信息的处理方式是这样的:
if 'submit' in post_data:
messages = function(...) # output is always a list
for m in messages:
request.session.flash(m)
这样做的时候,每次我重新提交同一个表单,之前的所有信息都会再次被添加到.flash()中。因此,错误信息就会不断累积。请问我该如何解决这个问题或者找到一个替代方法呢?
2 个回答
0
要回答这个问题其实挺难的,因为没有太多背景信息来说明它的目的。一般来说,使用闪存(flash)工作流程的想法是,你先把信息发送到表单,然后再把用户引导到一个地方,在那里所有的闪存消息都会显示出来。你所描述的情况是多次发送信息,而不一定是显示这些消息。
- 你可以让视图在添加更多内容之前先清空闪存队列。
- 你可以在发送数据时带上一个标记?
- 你也可以不使用闪存,换一种方式来处理这个情况。
我能想到的闪存队列在你显示消息时没有被清空的原因有:
- 你返回了自己的响应对象,导致会话工厂无法设置新的会话cookie。
- 你的代码产生了异常,这可能导致会话工厂忽略cookie的变化。
2
我找到了问题所在,但不太明白为什么会这样。在之前,我把 message
当作一个关键字来使用:
@classmethod
def validate(cls, message=[], **kwargs):
if this:
message.append(u'...')
return kwargs, message
我觉得在每次发送 POST 请求后,message
并没有被清空,即使我从来没有用 validate()
调用过它。不过,当我把 message
这个关键字去掉后,它就正常工作了:
@classmethod
def validate(cls, **kwargs):
message = []
...
有人知道这是为什么吗?