2014-09-21 114 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> 

做了這麼網頁會重定向到登錄頁面,在該頁面中的信息將得到顯示。