Como enviar uma mensagem sessão para um usuário anônimo em um site Django?
-
22-08-2019 - |
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.
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.