6

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

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

该函数如下所示:

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 中的消息设置是否正确?”

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

只有当我使用时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})

我还有其他几个需要使用 a 的地方,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”。

像这样正常调用两次吗?

这两个 URL 的 URL 部分如下所示:

# 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'),
4

2 回答 2

1

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

from django.contrib import messages << 如果您选择使用 django 消息传递,这是可选的

处理您的表格

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 ) #<< rememeber messages.success() along with messages.info() etc... are method calls if you choose to pass it through django's messaging

    return render(request,'template_name.html', {'message_disp':message })
于 2017-10-11T13:39:01.370 回答
1

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

你可以这样做:

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_errorhtml 页面上,插入 Javscript 以在超时后自动重定向您,例如:

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

    setTimeout(redirect, 3000);
</script>

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

于 2017-06-27T17:08:29.237 回答