我有一个注册表单,可以在成功提交的数据库中创建行。
提交后,我想将用户重定向到登录表单(这要求我将表单作为render()的参数传递),并传递状态为' REGISTRATION_SUCCESSFUL '作为参数。
return render(request, 'login.html', {
'form': login_form(),
'status': 'REGISTRATION_SUCCESSFUL'
})
根据状态,我的模板会显示一条消息,表明注册成功。
一切正常,直到您尝试刷新登录页面,它再次尝试提交注册表单(我想因为请求已转发到登录页面)。
我尝试的所有内容都涉及转发请求,这被证明是一个问题。救命?
提前致谢!
答案 0 :(得分:2)
在提交表单而不是使用呈现后,使用HTTPResponseRedirect。成功处理POST数据后,始终返回HttpResponseRedirect。如果用户点击“返回”按钮,这可以防止数据被发布两次。
您在此处遇到的问题是HTTPResponseRedirect不允许您传递状态为REGISTRATION_SUCCESSFUL的上下文。
根据状态,我的模板会显示一条消息,表明注册成功。
这是您可以使用Django's messages framework的地方。在HTTPResponseRedirect之前,您可以执行以下操作:
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import RegistrationForm
def registration(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
# ... do something special here if needed
messages.add_message(request, messages.INFO, 'Registration was successful!')
return HttpResponseRedirect(reverse('login_page'))
else:
form = RegistrationForm()
return render(request, 'registration.html', {'form': form})
现在在“login_page”中,您可以显示消息。仅供参考 - 消息是基于每个会话的,因此“注册成功”消息将仅显示给您重定向的用户:
login_page.html:(例如来自messages documentation)
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }} </li>
{% endfor %}
</ul>
{% endif %}
<form method="post">{% csrf_token %}
{{ form }} {# Your login form #}
</form>
在此示例中,您添加的所有邮件都将显示在您的登录表单上方。如果还有其他信息,例如“无效注册”,则会显示它们。
请务必Enable the Django Messages Framework将以下内容添加到settings.INSTALLED_APPS:
INSTALLED_APPS = (
...
'django.contrib.messages',
)
您的settings.MIDDLEWARE_CLASSES必须包含:
MIDDLEWARE_CLASSES = (
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
您的settings.TEMPLATE_CONTEXT_PROCESSORS必须包含:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.contrib.messages.context_processors.messages',
)
答案 1 :(得分:0)
注册成功后,您可能必须考虑redirect
这是成功发布后的常见做法。
Django为重定向提供了一个捷径。
return redirect('some-view-name', foo='bar')
return redirect('/some/url/')
对于您的情况,您可以考虑:
kwargs={'status': 'REGISTRATION_SUCCESSFUL' }
return redirect('login-view', **kwargs)
答案 2 :(得分:0)
from django.contrib import messages
from django.http import HttpResponseRedirect
if form1.is_valid():
registration = form1.save(commit=False)
registration.save()
messages.success(request, 'Your message here.')
return HttpResponseRedirect('/login/')
在模板中。 在div中你想要显示消息
{% block message %}
{% include "includes/messages.html"%}
{% endblock %}
然后在包含文件夹
中创建message.html文件<div id="messages">
{% for message in messages %}
<div class="alert alert-{{message.tags }} alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
{{ message }}
</div>
{% endfor %}
</div>
完成后,您的页面将重定向到登录页面,并在该页面上显示消息。