在我检查用户是否存在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">×</span>
</button>
{{ message }}
</div>
{% endfor %}
我不确定这是否重要 - 但看起来它几乎从某个地方叫“GET”两次。
这两个网址的网址部分如下所示:
# 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'),
答案 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的处理表单
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 })
如果你们有更好的方式打击我。 快乐的编码!