2009-03-30 5 views
6

Django 사이트의 익명 사용자에게 세션 메시지를 보내는 방법은 무엇입니까?

나는 장고 앱보기에서 로그인 한 사용자에 대한 사용자 행동에 관한 메시지를 다음과 같이 자주 보여줍니다 :

request.user.message_set.create("message to user") 

익명 사용자 (로그인하지 않은 사용자)도 어떻게 할 수 있습니까? 익명 사용자에 대한 request.user는 없지만 Django 문서에서는 "세션"미들웨어를 사용하면 위의 코드와 동일한 작업을 수행 할 수 있다고 말합니다. 세션 미들웨어에 링크 된 Django 문서는 가능하다고 주장하지만, 세션 문서에서이를 수행하는 방법을 찾지 못했습니다.

답변

4

세션 기반 메시지를 장고 트리에 넣을 수있는 패치가 나올 때까지 http://code.google.com/p/django-session-messages/을 참조하십시오. (최근에 보았 듯이, 1.2로 표시되었으므로 빠른 추가가 필요하지 않습니다 ...).

유사한 기능을 가진 또 다른 프로젝트는 Django Flash (http://djangoflash.destaquenet.com/)입니다.

+0

django_session_messages는이 패치의 코드가 실행되기 전에 모든 사용자 메시지를 삭제하는 django.core.context_processors.auth와 작동하지 않습니다. 아마도 장고에서 전체 메시지 시스템을 다시 수행하는 것을 고려할 수도 있습니다. – Evgeny

+0

설정에서 두 개의 컨텍스트 프로세서 순서를 뒤집으면 두 번째 컨텍스트 프로세서가 메시지 목록을 덮어 쓰게되므로 도움이되지 않습니다. – Evgeny

4

dict-like 오브젝트 인 세션에서 직접 데이터를 저장하십시오. 그런 다음보기/템플릿에서 값을 확인하십시오. 여기

더 자세한 정보는 :

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

또한 각각의 요청에 세션 개체를 확인하기 위해 미들웨어 클래스를 만들고, 거기 눈물/빌드를 할 수 있습니다.

project/application/context.py (메시지를 확인하고 컨텍스트에 추가) :

def messages(request): 
    messages = {} 
    if 'message' in request.session: 
     message_type = request.session.get('message_type', 'error') 
     messages = {'message': request.session['message'], 
        'message_type': message_type} 
     del request.session['message'] 
     if 'message_type' in request.session: 
      del request.session['message_type'] 
    return messages 

project/settings.py합니다 (TEMPLATE_CONTEXT_PROCESSORS에 컨텍스트를 추가) :

7

는 상황에 맞는 프로세서를 사용하는, 내가 할 것입니다
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.request", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.media", 
    "django.core.context_processors.auth", 
    "project.application.context.messages", 
) 

위의 기능을 사용하면 모든 요청에 ​​대해 messages이 호출되며 retu 템플릿의 컨텍스트에 rns가 추가됩니다. 나는 사용자에게 메시지를주고 싶은 경우 장소에두고,이 작업을 수행 할 수 있습니다

{% if message %} 
    <div id="system_message" class="{{ message_type }}"> 
     {{ message }} 
    </div> 
{% endif %} 

: 디스플레이에 오류가 있는지

def my_view(request): 
    if someCondition: 
     request.session['message'] = 'Some Error Message' 

마지막으로, 템플릿에 당신은 단지 확인하실 수 있습니다 메시지 유형은 스타일 ("error", "notice", "success")에 따라 스타일을 지정하는 데 사용되며이 설정 방법은 사용자에게 한 번에 하나의 메시지 만 추가 할 수 있지만 그 전부입니다 정말 필요하기 때문에 나를 위해 작동합니다. 여러 메시지 등을 허용하도록 쉽게 변경 될 수 있습니다.

관련 문제