表格後提交,而不是使用渲染,用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