表格后提交,而不是使用渲染,用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',
)
这样做了!非常感谢。对于任何想要实现上述内容的人,请确保您的settings.py文件配置正确(有此问题)。 – 2014-09-21 11:34:56
@DarylChan - 我根据您对未来读者的settings.py评论更新了我的答案。 – 2014-09-22 13:37:50