0

我有一些“保存”代码,在成功创建记录后使用 Django 消息传递框架设置成功消息,然后重定向回主“application_update”视图。我无法确定为什么这些消息没有通过重定向。在执行“render_to_response”时消息传递似乎工作得很好,但在执行“重定向”时却不行。

views.py 中的函数片段(如果是 POST):

if ovrd_form.is_valid():
    fields = {'application': ovrd_form.cleaned_data['application'],
              'course': ovrd_form.cleaned_data['course'],
              * other field/values *
             }
    try:
        overrides = Overrides(**fields)
        overrides.save()
        success_msg = 'Override creation was successful.'
        create_message(request, success_msg, 'success')
    except Exception, exception:
        return HttpResponse('Error: ' + str(exception))

    return redirect('application_update', app_id=app_id)

create_message() 函数:

from django.contrib import messages

def create_message(request, msg, msg_type):
    """ build a message & sets the correct message.type """
    if msg_type == 'error':
        django.contrib.messages.error(request, msg)
    elif msg_type == 'warning':
        django.contrib.messages.warning(request, msg)
    elif msg_type == 'success':
        django.contrib.messages.success(request, msg)
    elif msg_type == 'info':
        django.contrib.messages.info(request, msg)
    elif msg_type == 'debug':
        django.contrib.messages.debug(request, msg)

所有模板都继承了这段代码:

{% if messages %}
    {% for message in messages %}
        {% comment %}force -danger if error type for bootstrap css class{% endcomment %}
        {% if message.tags == 'error' %}
            <div class="alert alert-danger">
        {% else %}
            <div class="alert alert-{{ message.tags }}">
        {% endif %}
            <button type="button" class="close" data-dismiss="alert">&times;</button>
            <span>{{ message }}</span>
            </div>
    {% endfor %}
{% endif %}

任何帮助将不胜感激。

4

4 回答 4

1

我们使用类似于下面的功能来在一次或多次重定向后保留消息:

# Preserve any error messages... ie. if a redirect results in another
# redirect.  

from django.contrib import messages

def preserve_error_messages( request ):
    mstore = messages.get_messages( request )
    for m in mstore:
        messages.add_message( request, m.level, m.message, extra_tags = m.extra_tags )
    return

编辑:这相当于防止消息被清除/过期:https ://docs.djangoproject.com/en/1.4/ref/contrib/messages/#expiration-of-messages

于 2014-04-24T22:15:04.330 回答
1

您需要在目标视图中使用 RequestContext 才能将消息传递到模板中。最简单的方法是使用render快捷方式而不是 render_to_response:

return render(request, 'view.html', {'form': ovrd_form})

注意第一个参数是请求对象。

于 2014-04-24T22:32:33.623 回答
0

尤里卡!有点。看来我可能需要重新启动我的 VM 会话(看不到这是怎么回事,但是奇怪的事情......)或者我需要清除我的浏览器缓存(会话参数)。

重新启动虚拟机:我的 Vagrant VM 框有时会遇到内部时钟问题,这会导致 Oauth 差异,进而导致我的 REST API 调用失败,一旦我重新启动 SSH 会话和/或 vagrant halt 并且流浪我的虚拟机。这与我的消息传递问题有什么关系?不确定是不是,只是说随着时间的推移我可能会遇到一些虚拟机损坏,这可能会影响到我所知道的更多。我学到的教训是,只要我有不合时宜的奇怪现象就重新启动虚拟机。

  • 注意:我不是每晚都关闭我的虚拟机或计算机,而是把它带回家。这意味着它必须与不同的 wifi 网络建立联系,这导致我不得不经常重启我的 SSH 终端。因此,VM 会运行数天……或者至少直到它出现故障为止。

清除我的缓存:我让自己在周末忘记了这个问题,当我今天早上开始处理它时……哇!一切都很好。在尝试重新加载页面(以修复身份验证问题)之前,我必须执行上述 VM 操作,所以我不确定更正是否来自于此,或者仅仅是因为我的会话参数可能已过期。

感谢@TravisD 和@DanielRoseman 的帮助!

于 2014-04-28T13:25:27.877 回答
0

在下面添加local_settings.py并且它正在工作。

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

在这里了解更多。

于 2015-09-18T12:40:34.983 回答