2014-09-21 142 views
0

Django是新增功能,我对此有点麻烦。未通过请求呈现

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

一旦提交,我想将用户重定向到一个登录表单(需要我的形式来传递用于使()的参数),传递的“REGISTRATION_SUCCESSFUL”状态作为参数以及。

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

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

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

我试过的一切都涉及转发请求,这被证明是一个问题。帮帮我?

提前致谢!

回答

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

这样做了!非常感谢。对于任何想要实现上述内容的人,请确保您的settings.py文件配置正确(有此问题)。 – 2014-09-21 11:34:56

+0

@DarylChan - 我根据您对未来读者的settings.py评论更新了我的答案。 – 2014-09-22 13:37:50

0

注册成功后,您可能不得不考虑redirect这是成功发布后的常见做法。

Django为重定向提供了一个捷径。

return redirect('some-view-name', foo='bar') 

return redirect('/some/url/') 

对于你的情况,你可以考虑:的

kwargs={'status': 'REGISTRATION_SUCCESSFUL' } 

return redirect('login-view', **kwargs) 
+0

为了澄清,这可以工作,如果他的URL配置准备处理视图的“状态”参数。但是,我不关心这种方法,因为它会使URL变得混乱。它会显示http://www.example.com/login/REGISTRATION_SUCCESSFUL/。 – 2014-09-21 03:56:41

+0

@MichaelB:不,它不会。你只是传递参数,可以被拖入login.html模板,被重定向到 – 2014-09-21 04:09:53

+0

为了确保我没有错误地阅读文档,我测试了并得到了我期望的错误:Reverse for'test_redirect_to'参数'()'和关键字参数'{'status':'REGISTRATION_SUCCESSFUL'}'找不到。根据[重定向文档](https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#redirect),参数可以是模型,视图名称(带有诸如“状态” )或绝对URL。 – 2014-09-21 04:35:06

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> 

做了这么网页会重定向到登录页面,在该页面中的信息将得到显示。