如何从Django中的HttpResponseRedirect传递消息?

时间:2013-02-21 09:51:28

标签: django

我有一个视图执行某项任务并返回另一个呈现hello.html模板的视图。

def 1stview(request):
   #Do this
   #Do that
   return HttpResponseRedirect('/success/')

def success(request):
    return render_to_response('overview.html', {'overview_files': b, 'total_files':total_files, 'total_size':total_size, 'username': username}, context_instance=RequestContext(request))

成功完成第一个视图后,我想在overview.html中传递“成功”消息。有很多重定向到success视图。我只想在浏览第一个视图时传输消息。我怎么能这样做?

4 个答案:

答案 0 :(得分:18)

使用messages framework在页面请求之间发送消息。

答案 1 :(得分:12)

添加更详细的答案。

1:在 settings.py 中配置信息存储空间:

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

或者如果您不使用会话,请使用CookieStorage:

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.CookieStorage'

2:在您看来,导入 django.contrib.messages

from django.contrib import messages

3:在返回HttpResonse之前设置消息数据:

messages.success(request, 'Changes successfully saved.')

这是:

的简写
messages.add_message(request, messages.SUCCESS, 'Changes successfully saved.')

然后可以在模板中使用消息标记(在本例中为 messages.SUCCESS ),即添加相应的CSS类或隐藏调试消息。 Django默认包含一些,但是如果您希望将它与Bootstrap的默认警报类一起使用,则需要为缺少的警报类添加一些自定义message tags

4:在模板中,如果使用Bootstrap警报,则可以使用这样的消息:

{% if messages %}
    {% for message in messages %}
        <div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</div>
    {% endfor %}
{% endif %}

例如,Django使用'error'作为ERROR的默认标记,而Bootstrap使用危险来指示错误。最好的解决方案是使用自定义标签,但您也可以在模板中进行monkeypatch(丑陋的解决方案):

{% if messages %}
    {% for message in messages %}
            <div class="alert {% if message.tags %}alert-{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}danger{% else %}{{ message.tags }}{% endif %}{% endif %}" role="alert">{{ message }}</div>
    {% endfor %}
{% endif %}

答案 2 :(得分:2)

from django.contrib import messages
messages.success(request, _('Thank you'))
return redirect('/whatever/')

答案 3 :(得分:2)

使用i18n 网址时要小心!如果您使用/whatever/之类的链接但使用国际化,则会重定向到/en/whatever/,从而丢失请求中的消息。如果您使用国际化,请始终将语言传递给URL:

from django.contrib import messages
from django.utils.translation import get_language

messages.success(request, _('Thank you'))
return redirect('/%s/whatever/' % get_language())

花费我几个小时来理解这一点......