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

pyn*_*ice 20 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))
Run Code Online (Sandbox Code Playgroud)

成功完成第一个视图后,我想传递"成功"消息overview.html.有很多重定向要success查看.我只想在浏览第一个视图时传输消息.我怎样才能做到这一点?

And*_*röm 19

添加更详细的答案.

1:在settings.py中配置消息存储:

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
Run Code Online (Sandbox Code Playgroud)

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

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.CookieStorage'
Run Code Online (Sandbox Code Playgroud)

2:在您的视图中,导入django.contrib.messages:

from django.contrib import messages
Run Code Online (Sandbox Code Playgroud)

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

messages.success(request, 'Changes successfully saved.')
Run Code Online (Sandbox Code Playgroud)

这是一个简写:

messages.add_message(request, messages.SUCCESS, 'Changes successfully saved.')
Run Code Online (Sandbox Code Playgroud)

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

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

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

例如,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 %}
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 18

使用消息框架在页面请求之间发送消息.


Öze*_* S. 7

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

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


Zam*_*zal 5

from django.contrib import messages
messages.success(request, _('Thank you'))
return redirect('/whatever/')
Run Code Online (Sandbox Code Playgroud)