【问题标题】:Django messaging framework messages not making it passed the redirect()Django 消息传递框架消息未通过 redirect()
【发布时间】:2014-04-24 21:43:42
【问题描述】:

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

views.py 中的函数 sn-p(如果是 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 %}

非常感谢任何帮助。

【问题讨论】:

  • 您是否在显示消息的视图中使用 RequestContext?
  • @DanielRoseman -- 不,我没有使用 RequestContext,我也不熟悉它。我应该使用它吗?
  • 嗯,有些东西需要将消息传递到上下文中。从该视图发布渲染调用。
  • @DanielRoseman -- 你是说这个吗? --> return render_to_response('view.html', {'form': ovrd_form}, context)

标签: django django-messages


【解决方案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

【讨论】:

  • 现在我明白了。但是您不会在任何地方设置storage.used = False,对吗?我猜这没关系?
  • 我正在重新添加消息。 (不知道为什么我被否决了......?!)
  • 不知道为什么不赞成特拉维斯。在尝试使事情正常进行时,我确实将其纳入了我的项目中,并且效果很好。然而,最后,我的消息通过重定向工作,因此没有长期使用您的解决方案。非常感谢您发布它!附言我给了你一个赞成票,希望能稍微平衡一下。
【解决方案2】:

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

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

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

【讨论】:

  • 这也能获取我的上下文字典吗?
  • {'form': ovrd_form} 你的上下文字典。我不知道你称之为 context 的其他参数在做什么。
  • 实际上,我在原始 render_to_response 中传递的“上下文”参数是一个非常重要的字典。我想出了如何让它在渲染语句中正确传递:return render(request, 'view.html', {'form': app_form, 'note_form': note_form}, context_instance=context)。不过,现在我又回到了原点……消息仍然没有通过。有什么想法吗?
  • 更新:我发现我们确实构建了 DirectContext 的子类,并且它在“context”字典中传递。但是,这在 render_to_response 方法中有效,并且只要我设置 context_instance=context 就可以在 render 方法中工作。不确定这是否会以某种方式覆盖传递消息所需的请求变量。 ??
  • @DanielRoseman:嗨,丹尼尔。你能帮我解决这个问题吗:stackoverflow.com/questions/32600473/…为此苦苦挣扎了这么久。
【解决方案3】:

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

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

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

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

感谢@TravisD 和@DanielRoseman 的帮助!

【讨论】:

    【解决方案4】:

    local_settings.py 下方添加,它正在工作。

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

    了解更多here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多