2014-09-21 3 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을 사용할 수 있습니다.

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"에, 당신은 메시지를 표시 할 수 있습니다 오른쪽 HTTPResponseRedirect하기 전에, 당신이 뭔가를 할 수 있습니다. 참고 - 메시지는 세션별로, 그래서 메시지 만 리디렉션 사용자에게 표시됩니다 "등록 성공"

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 파일이 제대로 구성되었는지 확인하십시오 (문제가 있음). –

+0

@DarylChan - 향후 독자를위한 settings.py 코멘트를 기반으로 답변을 업데이트했습니다. –

0

등록이 성공적으로 완료된 후에는 게시가 완료된 후 일반적인 방법 인 redirect을 고려해야 할 수 있습니다.

장고는 리디렉션을위한 바로 가기를 제공합니다.

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/이 표시됩니다. –

+0

@MichaelB : 아니오, 그렇지 않습니다. 당신은 단지 –

+0

로 리디렉션되는 login.html 템플릿으로 가져올 수있는 매개 변수를 전달하고 있습니다. 내가 설명서를 읽는 것에 대해 틀리지 않았 음을 확인하기 위해 테스트를 통해 예상 한 오류가 발생했습니다 : 'test_redirect_to' 인수 '()'및 키워드 인수 '{'status ':'REGISTRATION_SUCCESSFUL '}'이 (가) 없습니다. [리디렉션 설명서] (https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#redirect)에 따르면 인수는 모델, 뷰 이름 ("status") 또는 절대 URL입니다. –

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/') 
템플릿의

당신이

{% block message %} 

    {% include "includes/messages.html"%} 
{% endblock %} 

그런 다음에 message.html 파일을 생성 메시지를 표시 할 DIV에 폴더를 포함

<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> 

그래서 페이지가 로그인 페이지로 리디렉션됩니다 완료하고 해당 페이지의 메시지를 얻을 것이다 디스플레이.