Pergunta

Muitas vezes eu mostrar mensagens sobre as ações do usuário para usuários logados em meus pontos de vista aplicação Django usando:

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

Como eu poderia fazer o mesmo para anônimo (não logado) usuários? Não há request.user para usuários anônimos, mas a documentação Django diz que o uso da "sessão" middleware que você pode fazer a mesma coisa que o código acima. A documentação Django que os links para as reivindicações sessão de middleware é possível, mas eu não conseguia encontrar a forma de fazê-lo a partir da documentação sessão.

Foi útil?

Solução

http://code.google.com/p/django-session -messages / até que o patch que permite a sessão mensagens baseadas terras na árvore Django (como eu vi recentemente, está marcado para 1.2, então não há esperança para a adição rápida ...).

Outro projeto com funcionalidade semelhante é Django flash ( http://djangoflash.destaquenet.com/ ) .

Outras dicas

Isto é o que eu faço, usando processadores de contexto:

project/application/context.py (cheque de mensagens e adicioná-los para o contexto):

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 (adicionar contexto à TEMPLATE_CONTEXT_PROCESSORS):

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",  
)

Com a acima da messages função será chamado em cada solicitação e tudo o que ele retorna serão adicionados ao contexto do modelo. Com isso no lugar, se eu quiser dar ao usuário uma mensagem, eu posso fazer isso:

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

Finalmente, em um modelo que você pode apenas verificar se há erros para display:

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

O tipo de mensagem é usado apenas para o estilo de acordo com o que é ( "Erro", "aviso", "sucesso") ea forma que esta é a configuração que você só pode adicionar 1 mensagem de cada vez para um usuário, mas que é tudo que eu realmente precisar para que ele funciona para mim. Pode ser facilmente alterado para permitir múltiplas mensagens e tal.

Armazenar os dados diretamente na sessão, que é um dicionário-como objeto. Em seguida, na visão / modelo, verificar o valor.

Mais informações aqui:

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

Você também pode criar uma classe de middleware para verificar se o objeto de sessão em cada pedido, e fazer a sua acumulação / lágrima lá em baixo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top