Han*_*nny 6 python django redirect messages django-messages
在检查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')
Run Code Online (Sandbox Code Playgroud)
此功能检查用户设置并适当地重定向我 - 但该消息从未出现在模板的顶部。
您可能首先会想:“您的 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})
Run Code Online (Sandbox Code Playgroud)
我还有其他一些需要使用 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})
Run Code Online (Sandbox Code Playgroud)
我在文档中找不到任何内容说您不能通过重定向发送消息……但我不知道如何让它们显示出来。
编辑: 这就是我在模板中呈现消息的方式:
{% 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">×</span>
</button>
{{ message }}
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我不确定这是否重要 - 但看起来它几乎从某个地方调用了两次“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'),
Run Code Online (Sandbox Code Playgroud)
您无法查看错误消息,因为它没有被渲染,因此该消息无处可去。执行此类操作的最佳方法是呈现一个中间页面,该页面将显示错误消息,并在超时后重定向,这是支付网关在将您重定向到银行时使用的某种方式。
你可以这样做:
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})
Run Code Online (Sandbox Code Playgroud)
在no_setting_errorhtml 页面上,插入 Javscript 以在超时后自动重定向您,例如:
<script>
function redirect(){
window.location.href = "/user_settings";
}
setTimeout(redirect, 3000);
</script>
Run Code Online (Sandbox Code Playgroud)
user_settings这将在 3 秒后自动将您从错误页面重定向到该页面。