2009-09-23 5 views
31

사용자가 정보를 입력 한 후 동일한 페이지로 리디렉션되는 양식이 있으므로 정보를 계속 입력 할 수 있습니다. 양식 제출이 성공하면 반환합니다.Django에서 HttpResponseRedirect를 사용할 때 템플릿 컨텍스트 정보를 전달하는 방법은 무엇입니까?

HttpResponseRedirect(request.path) 

잘 작동합니다. 그러나이 경우 사용자에게 몇 가지 메시지를 표시하고 싶습니다 (예 : '데이터가 저장되었습니다'화면 상단에 있음). 리디렉션하지 않으면 문맥 사전에 이러한 메시지를 반환합니다. 그러나 리디렉션을 사용하면이 작업을 수행 할 수 없습니다.

그래서 HttpResponseRedirect를 사용할 때 템플릿 컨텍스트 정보를 전달할 수 있습니까?

내가하려는 일은 믿을 수 없을만큼 일반적 일 것 같아서, 뭔가 분명하지 않은 것이 있으면 용서해주십시오.

+0

이가 기록 된 한 사용자? –

+0

두 번째 페이지의 로딩은 브라우저에서 별도로 요청한 후 발생합니다 (첫 번째 응답은 302를 반환합니다). 그래서 HttpResponseRedirect를 사용할 것으로 기대되는 것처럼보기간에 정보를주고받을 수 없습니다. IMHO, 세션 프레임 워크는 요청간에 정보를 전달하는 가장 쉬운 방법입니다. –

답변

5

가장 좋은 방법은 리디렉션 URL에 코드화 된 쿼리를 사용하는 것입니다. 예전의 접근 방식입니다.

당신은

같은 뭔가를 할 수

/페이지 /? m = 1/페이지 /? m = 2 등

그런 다음 뷰 코드와 쇼 request.GET와 그 변수를 구문 분석 적절한 메시지.

6

수 없습니다. HttpResponseRedirect는 클라이언트 쪽 리디렉션 (HTTP 상태 코드 302)을 브라우저에 보내고 브라우저가 다른 페이지를 다시 요청합니다.

리디렉션에 URL 검색어 문자열을 설정할 수는 있지만 사용자 및 HTTP 요청 (즉, 프록시)을 가로 채는 사람에게 표시 될 수 있으므로 민감한 정보에는 적합하지 않습니다. 당신은 추가

+2

세션 프레임 워크는 어떻습니까? –

0

쿼리 문자열에 = 1 저장과 같은으로 확인 :

saved = request.GET.get('saved', False) 
1

내가 리디렉션 어떤 데이터를 전달하는 알고있는 유일한 방법은 URL에 GET 매개 변수를 추가하는 것입니다 =

[당신이 전달하는 현재의 경로] 메시지

을 저장 한 다음 메시지 = 저장 매개 변수를 처리?. 당신은 XSS는 같은 특정 상수를 전달하려는 것 해킹 방지하려면에 전달하는 전달한 경로의 핸들러에서

좀 더 복잡한 방법은 리디렉션에서 데이터를 전달하지 않고 대신 http://code.google.com/p/django-notify/과 같은 것을 사용하여 리디렉션 후에 사용자에게 표시되는 세션 기반 데이터를 저장하는 것입니다.

10

당신이 인증을 사용하고 당신이 할 수 로그인 한 사용자가있는 경우 :

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.message_set.create

는 PARAMS도 해킹이 불가능한 있습니다 GET. 다른 해답에서 언급 한 것처럼 쿼리 문자열을 사용할 수 있습니다.

가장 선호되는 방법은 세션 프레임 워크를 사용하는 것이라고 생각합니다.그런 식으로 당신은 당신이 맥락에서 원하는로드 및

{{ request.session.foo }} 

foo 메시지가 될 수 얻거나 당신은 할 수 있습니다 :

{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %} 

및 기타 재미있는 물건을. 당신이 들린 당신의 views.py에서

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

+0

as request.session [ 'foo'] = 1? –

+0

예, 두 번째 템플릿 코드. 또는 첫 번째 템플릿 스 니펫의 경우 로직에 따라 전체 메시지를 넣을 수 있습니다. –

+0

나는 장고에서 얼마나 쉬운 세션이 사용되는지 알지 못했다 ... 이것을 제안 해 주셔서 감사합니다. 나는이 방법을 사용했고 아주 잘 작동한다. – nicorellius

0

세션에 키/값 쌍을 넣어 다음 HTML 템플릿에서 읽을해야합니다. 예를 들어

: 완료 및 향후 참조를 위해서

views.py

# your code here 
request.session['vote'] = 1 
return HttpResponseRedirect(request.path) 

your_template.html

{% ifequal request.session.vote 1 %} 
    <!-- Your action here --> 
{% endifequal %} 
+0

이전 답변이지만이 질문에 내가 사용할 수있는 것으로 의심됩니다. http://stackoverflow.com/questions/41317128/using-httpresponseredirect-in-a-django-view-where-context-has -to-be-passed 당신이 시간을 가지고 있다면 그것에 대한 당신의 생각을 듣기를 좋아할 것입니다 :-) –

45

, 당신은 지금 the messages framework를 사용할 수 있습니다. 당신이 그것을 설치 한 후 :

views.py

from django.contrib import messages 

def view(request): 
    # your code 
    messages.success(request, "Your data has been saved!") 
    HttpResponseRedirect(request.path) 

template.html

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
관련 문제