表单提交后,不要使用渲染,而是使用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.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>
在此示例中,您添加的任何消息都将显示在您的登录表单上方。如果还有“注册无效”等其他信息,就会显示出来。
请务必将以下内容添加到您的settings.INSTALLED_APPSEnable the Django Messages Framework:
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',
)