python 차이 - HTTP 리다이렉트를 사용하여 정보를 전달하는 법(장고에서)




함수 처리 (10)

이것은 Django의 내장 된 기능으로 "메시지"

http://docs.djangoproject.com/en/dev/topics/auth/#messages 참조 http://docs.djangoproject.com/en/dev/topics/auth/#messages

문서에서 :

메시지는 사용자와 연관됩니다. 만료 또는 타임 스탬프 개념은 없습니다.

메시지는 Django 관리자가 성공적으로 작업 한 후에 사용됩니다. 예를 들어, "설문 조사 Foo가 성공적으로 생성되었습니다." 메시지입니다.

양식 제출을 수락하고 모델을 업데이트하는보기가 있습니다.

모델을 업데이트 한 후 다른 페이지로 리디렉션하고 "Field X successfully updated"와 같은 메시지를이 페이지에 표시하려고합니다.

이 메시지를 다른 페이지로 "전달"하려면 어떻게해야합니까? HttpResponseRedirect는 URL 만 허용합니다. 이전에 다른 사이트에서이 작업을 수행 한 것을 보았습니다. 이것이 어떻게 완성 되었습니까?


메시지 프레임 워크를 사용하는 아이디어가 마음에 들었지만 장고 문서의 예제는 위 질문의 맥락에서 나에게 적합하지 않습니다.

정말로 나를 귀찮게하는 것은 django 문서의 라인입니다.

If you're using the context processor, your template should be rendered with a RequestContext. Otherwise, ensure messages is available to the template context.

(나와 같은) 초보자에게는 이해할 수 없으며 두 옵션이 어떻게 보이는지에 따라 확장되어야합니다.

나는 위의 질문에 답하지 않는 RequestContext로 렌더링해야하는 솔루션을 찾을 수만 있었다.

아래의 두 번째 옵션에 대한 해결책을 만들었다 고 생각합니다.

바라기를 이것은 다른 누군가를 도울 것입니다.

== urls.py ==

from django.conf.urls.defaults import *
from views import *

urlpatterns = patterns('',
    (r'^$', main_page, { 'template_name': 'main_page.html', }, 'main_page'),
    (r'^test/$', test ),

== viewtest.py ==

from django.contrib import messages
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

def test(request):
    messages.success( request, 'Test successful' )
    return HttpResponseRedirect( reverse('main_page') )

== viewmain.py ==

from django.contrib.messages import get_messages
from django.shortcuts import render_to_response

def main_page(request, template_name ):
    # create dictionary of items to be passed to the template
    c = { messages': get_messages( request ) }

    # render page
    return render_to_response( template_name, c, )

== main_page.html ==

{% block content %}
    {% if messages %}
    <div>
        {% for message in messages %}
            <h2 class="{{message.tag}}">{{ message.message }}</h2>
        {% endfor %}
    </div>
    {% endif %}
{% endblock %}

모든 제안이 지금까지는 효과가 있지만 Ry4an (요청 URL에서 전달)을 사용하는 것이 좋습니다. 미리 정의 된 텍스트 메시지 세트 내에서 실제 텍스트를 코딩 된 텍스트로 변경하십시오.

여기에 두 가지 이점이 있습니다.

  1. 나쁜 콘텐츠를 제거하여 무언가 해킹 할 가능성을 줄입니다.
  2. 필요한 경우 나중에 메시지를 현지화 할 수 있습니다.

다른 쿠키 관련 방법 .. 글쎄, 그들은 브라우저가 쿠키를 지원하지 않으면 작동하지 않으며, 약간 더 비쌉니다 ..하지만 약간. 그들은 실제로 눈을 깨끗하게합니다.



django-flashcookie 앱 http://bitbucket.org/offline/django-flashcookie/wiki/Home 사용할 수 있습니다.

여러 개의 메시지를 보낼 수 있으며 무제한 유형의 메시지를 가질 수 있습니다. 경고를위한 하나의 메시지 유형과 오류 메시지를위한 하나의 메시지 유형을 원한다고 말할 수 있습니다.

def simple_action(request):
    ...
    request.flash['notice'] = 'Hello World'
    return HttpResponseRedirect("/")

또는

def simple_action(request):
    ...
    request.flash['error'] = 'something wrong'
    return HttpResponseRedirect("/")

또는

def simple_action(request):
    ...
    request.flash['notice'] = 'Hello World'
    request.flash['error'] = 'something wrong'
    return HttpResponseRedirect("/")

또는

def simple_action(request):
    ...
    request.flash['notice'] = 'Hello World'
    request.flash['notice'] = 'Hello World 2'
    request.flash['error'] = 'something wrong'
    request.flash['error'] = 'something wrong 2'
    return HttpResponseRedirect("/")

그리고 나서 당신과 함께 보여줄 템플릿

{% for message in flash.notice %}
    {{ message }}
{% endfor }}

또는

{% for message in flash.notice %}
    {{ message }}
{% endfor }}
{% for message in flash.error %}
    {{ message }}
{% endfor }}

리디렉션 URL을 이미 매개 변수화 된보기의 경로로 지정할 수도 있습니다.

urls.py :

(r'^some/path/(?P<field_name>\w+)/$', direct_to_template,
    {'template': 'field_updated_message.html',
    },
    'url-name'
),

views.py :

HttpResponseRedirect( reverse('url-name', args=(myfieldname,)) )

args =는 튜플을 취해야 함을주의하십시오.


나는이 코드가 당신을 위해 일해야한다고 생각한다.

request.user.message_set.create(message="This is some message")
return http.HttpResponseRedirect('/url')

Pydev UA가 사용하는 솔루션은 덜 관입 적이기 때문에 코드에서 거의 수정하지 않고 사용할 수 있습니다. 메시지를 전달할 때 메시지를 처리하는보기에서 컨텍스트를 업데이트 할 수 있으며 템플릿에서 표시 할 수 있습니다.

나는 같은 접근법을 사용했지만 간단한 텍스트를 전달하는 대신 유용한 필드에 정보를 담은 나에게 전달했다. 그런 다음보기에서 컨텍스트를 업데이트 한 다음 렌더링 된 템플릿을 업데이트 된 컨텍스트로 반환했습니다.

간단하고 효과적이며 방해가되지 않습니다.


나는 모든 대답을 읽고 점검했으며, 지금가는 길은 메시징 프레임 워크를 사용 하고 있는 것으로 보인다. 답장 중 일부는 꽤 오래되었고 게시 당시 적절한 방법이었을 것입니다.


(Python2.7 * 전용 : Python3 *을위한 더 간단한 솔루션이 있습니다.)

표준 라이브러리 모듈을 가져 오는 것에 반대하지 않는다면 할 수 있습니다.

from functools import reduce

def merge_dicts(*dicts):
    return reduce(lambda a, d: a.update(d) or a, dicts, {})

( 항상 성공으로 돌아 가기 때문에 or a비트 lambda가 필요 dict.update합니다 None.)





python django http