在django中传递消息时重定向

时间:2017-06-27 16:00:38

标签: python django redirect messages django-messages

在我检查用户是否存在user_settings之后,我正在尝试运行重定向(如果它们不存在 - 用户被带到表单输入并保存它们。)< / p>

我想将用户重定向到相应的表单并向他们发送他们必须“保存设置”的消息,以便他们知道为什么要重定向他们。

该功能如下所示:

def trip_email(request):
    try:
        user_settings = Settings.objects.get(user_id=request.user.id)
    except Exception as e:
        messages.error(request, 'Please save your settings before you print mileage!')
        return redirect('user_settings')

此功能检查用户设置并适当地重定向 - 但消息永远不会出现在模板的顶部。

您可能首先想到:“您的Django中的消息是否正确设置?”

我还有其他功能,我使用 not 重定向的消息,消息在模板中按预期显示没有问题。消息被适当地集成到我的模板中并且可以正常工作。

只有当我使用redirect时,才会看到我发送的消息。

如果我使用render,如下所示,我会看到消息(但当然,URL不会改变 - 我希望发生这种情况)。

def trip_email(request):
    try:
        user_settings = Settings.objects.get(user_id=request.user.id)
    except Exception as e:
        messages.error(request, 'Please save your settings before you print mileage!')
        form = UserSettingsForm(request.POST or None)
        return render(request, 'user/settings.html', {'form': form})

我还有其他几个需要使用redirect的地方,因为它在功能上是有意义的 - 但我也想将消息传递给那些重定向。

user_settings函数如下所示:

def user_settings(request):
    try:
        user_settings = Settings.objects.get(user_id=request.user.id)
        form = UserSettingsForm(request.POST or None, instance=user_settings)
    except Settings.DoesNotExist:
        form = UserSettingsForm(request.POST or None)
    if request.method == 'POST':
        settings = form.save(commit=False)
        settings.user = request.user
        settings.save()
        messages.warning(request, 'Your settings have been saved!')

    return render(request, 'user/settings.html', {'form': form})

我在文档中找不到任何内容,说明无法发送带有重定向的邮件...但我无法弄清楚如何让它们显示。

编辑: 这就是我在模板中呈现消息的方式:

{% for message in messages %}
  <div class="alert {{ message.tags }} alert-dismissible" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
    {{ message }}
  </div>
{% endfor %}

我不确定这是否重要 - 但看起来它几乎从某个地方叫“GET”两次。

is calling get twice like this normal?

这两个网址的网址部分如下所示:

# ex: /trips/email
url(r'^trips/email/$', views.trip_email, name='trip_email'),
# ex: /user/settings
url(r'^user/settings/$', views.user_settings, name='user_settings'),

2 个答案:

答案 0 :(得分:0)

您无法查看错误消息,因为它未呈现,因此消息无处可去。执行此类操作的最佳方法是呈现一个中间页面,该页面将显示错误消息,并在超时后重定向,这是支付网关在将您重定向到您的银行时所使用的类型。

您可以这样做:

def trip_email(request):
    try:
        user_settings = Settings.objects.get(user_id=request.user.id)
    except Exception as e:
        return render(request, 'no_setting_error.html', {'form': form})

并在no_setting_error html页面上,插入Javscript以在超时后自动重定向,例如:

<script>
    function redirect(){
       window.location.href = "/user_settings";
    }

    setTimeout(redirect, 3000);
</script>

这将在3秒后自动将您从错误页面重定向到user_settings页面。

希望这有帮助!

答案 1 :(得分:0)

不,我认为最好的方法是使用你的会话。

来自django.contrib的

导入消息&lt;&lt;如果您选择使用django messaging

,这是可选的

处理表单

def handle_form(request):
    ...
    request.session['form_message'] = "success or fail message here"

    redirect('/destination/', {})

def page_to_render_errors():
    ...
    message = None
    if( 'form_message' in request.session ):
        message = request.session['form_message']
        del request.session['form_message']
        messages.success = (request, message ) #<< if you choose to pass it through django's messaging

    render(request,'template_name.html', {'message_disp':message })

如果你们有更好的方式打击我。 快乐的编码!