복붙노트

[PYTHON] 어떻게 Django에서 HttpResponseRedirect를 사용할 때 템플릿 컨텍스트 정보를 전달합니까?

PYTHON

어떻게 Django에서 HttpResponseRedirect를 사용할 때 템플릿 컨텍스트 정보를 전달합니까?

사용자가 정보를 입력 한 후 동일한 페이지로 리디렉션되는 양식이 있으므로 (정보를 계속 입력 할 수 있도록) 양식 제출이 성공하면 반환합니다.

HttpResponseRedirect(request.path)

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

HttpResponseRedirect를 사용할 때 어떻게 템플릿 컨텍스트 정보를 전달할 수 있습니까?

내가하려는 일은 믿을 수 없을 정도로 흔한 일 인 것 같아서, 내가 명백한 것을 놓치고 있다면 저를 용서해주십시오.

해결법

  1. ==============================

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

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

    당신은 뭔가를 할 수 있습니다.

    / page /? m = 1, / page /? m = 2 등

    그런 다음 뷰 코드에서 request.GET을 사용하여 해당 변수를 구문 분석하고 적절한 메시지를 표시합니다.

  2. ==============================

    2.완료 및 향후 참조를 위해 이제 메시지 프레임 워크를 사용할 수 있습니다. 설치 한 후 :

    완료 및 향후 참조를 위해 이제 메시지 프레임 워크를 사용할 수 있습니다. 설치 한 후 :

    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 %}
    
  3. ==============================

    3.인증을 사용하고 로그인 한 사용자가 다음과 같이 할 수 있습니다.

    인증을 사용하고 로그인 한 사용자가 다음과 같이 할 수 있습니다.

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

    GET 매개 변수도 해킹 가능합니다. 다른 해답에서 언급 한 것처럼 쿼리 문자열을 사용할 수 있습니다.

    가장 선호되는 방법은 세션 프레임 워크를 사용하는 것입니다. 그렇게하면 컨텍스트에서 원하는 모든 것을로드 할 수 있습니다.

    {{ request.session.foo }} 
    

    foo가 메시지 일 수 있거나 할 수 있습니다.

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

    및 기타 재미있는 것들.

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

  4. ==============================

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

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

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

  5. ==============================

    5.리다이렉트가있는 데이터를 전달하는 유일한 방법은 전달하는 URL에 GET 매개 변수를 추가하는 것입니다. XSS 해킹을 피하려면 다음과 같은 특정 상수를 전달해야합니다.

    리다이렉트가있는 데이터를 전달하는 유일한 방법은 전달하는 URL에 GET 매개 변수를 추가하는 것입니다. XSS 해킹을 피하려면 다음과 같은 특정 상수를 전달해야합니다.

    [현재 전달중인 경로]? message = saved

    그리고 전달 된 경로에 대한 핸들러에서 message = saved 매개 변수를 처리하십시오.

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

  6. ==============================

    6.view.py에서 키 / 값 쌍을 세션에 넣은 다음 HTML 템플리트에서 읽어야합니다.

    view.py에서 키 / 값 쌍을 세션에 넣은 다음 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  %}
    
  7. ==============================

    7.? saved = 1을 쿼리 문자열에 추가하고 다음과 같이 확인하십시오.

    ? saved = 1을 쿼리 문자열에 추가하고 다음과 같이 확인하십시오.

    saved = request.GET.get('saved', False)
    
  8. from https://stackoverflow.com/questions/1463489/how-do-i-pass-template-context-information-when-using-httpresponseredirect-in-dj by cc-by-sa and MIT license