30

我有一个执行特定任务的视图并返回到另一个呈现 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

5 回答 5

39

添加更详尽的答案。

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 的默认警报类一起使用,您将需要为缺少的添加一些自定义消息标签

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 使用危险来指示错误。最好的解决方案是使用自定义标签,但您也可以在模板中对其进行猴子补丁(丑陋的解决方案):

{% 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 %}
于 2018-03-22T09:42:37.377 回答
22

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

于 2013-02-21T10:13:57.630 回答
8

使用 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())

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

于 2017-09-25T19:57:33.617 回答
4
from django.contrib import messages
messages.success(request, _('Thank you'))
return redirect('/whatever/')
于 2017-09-18T13:51:03.233 回答
0

看了这个问题,有一个问题:如果重定向来自1stview以外的函数,消息会一直显示;因此,我们必须通过 send 检查重定向是否来自 1stview。GET 是当前状态。

from django.contrib import messages
def 1stview(request):
   
   return HttpResponseRedirect('/success/'+'?Status='+'True')

def success(request):
    Pass_1stview = request.GET.get('Status')
    if Pass_1stview :
       messages.success(request, _('Content of the messages'))
    return render_to_response('overview.html', {'overview_files': b, 'total_files':total_files, 'total_size':total_size, 'username': username}, context_instance=RequestContext(request))
于 2021-11-25T13:55:00.293 回答