渲染而不传递请求

时间:2014-09-21 01:42:38

标签: python django django-forms django-templates

Django的新手,我对此有点麻烦。

我有一个注册表单,可以在成功提交的数据库中创建行。

提交后,我想将用户重定向到登录表单(这要求我将表单作为render()的参数传递),并传递状态为' REGISTRATION_SUCCESSFUL '作为参数。

return render(request, 'login.html', {
    'form': login_form(), 
    'status': 'REGISTRATION_SUCCESSFUL'
})

根据状态,我的模板会显示一条消息,表明注册成功。

一切正常,直到您尝试刷新登录页面,它再次尝试提交注册表单(我想因为请求已转发到登录页面)。

我尝试的所有内容都涉及转发请求,这被证明是一个问题。救命?

提前致谢!

3 个答案:

答案 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">&times;</button>
                {{ message }}
        </div>      

    {% endfor %}
</div>

完成后,您的页面将重定向到登录页面,并在该页面上显示消息。