Você usa o recurso de mensagens do sistema?
Quando eu comecei a usar o Django, eu criava uma página para "exibir mensagens do sistema ao usuário". É uma mania remanescente dos tempos de PHP que resolve bem a necessidade de mostrar coisas como "Senha modificada com sucesso!". Isso se prolongou por mêses, por uma maldita falta de atenção ao ler a documentação [1] do sistema de autenticação.
Pois é, o Django oferece o recurso de mensagens do sistema para fazer justamente isso: mostrar mensagens de aviso ao usuário.
Este sistema funciona como um pool: você lança quantas mensagens quiser em uma instância específica para isso e na primeira oportunidade, aquelas mensagens são despejadas para o usuário, limpa o pool e começa tudo novamente.
A forma mais comum de se mostrar mensagens é criando um espaço em seu template mais básico (aquele do qual todos são herdados) para mostrar essas mensagens. Vamos fazer e ver como funciona.
Registrando mensagens
Primeiramente, é preciso estar ciente de que as mensagens são registradas por usuário, ou seja, este recurso não está disponível para usuários anônimos (usuários que não logaram no sistema). Isso tem solução, que vou mostrar adiante, mas vamos nos atêr ao registro da mensagem.
A qualquer momento, tendo-se um usuário em mãos - normalmente a partir da variável request.user - basta escrever o seguinte código para registrar uma mensagem para aquele usuário:
usuario.message_set.create(message='Mensagem')Na prática, nós poderíamos fazer um código como o seguinte:
@login_required
def excluir(request, cliente_id):
try:
Cliente.objects.get(id=cliente_id).delete()
request.user.message_set.create(message=_('Cliente excluido com sucesso'))
except Cliente.DoesNotExist, e
request.user.message_set.create(message=_('Cliente nao encontrado'))
return HttpResponseRedirect('/clientes/')Este código acima tenta excluir um Cliente existente e exibe uma mensagem de sucesso após o feito, caso o Cliente citado não exista, uma mensagem de aviso é dada.
Mostrando as mensagens ao usuário
Agora, para mostrar as mensagens registradas a um usuário, basta utilizar-se da variável de contexto messages. Para que esta mensagem esteja disponível, é necessário que seu template seja tratado no contexto padrão, ou seja, caso tenha utilizado render_to_response, não se esqueça de colocar o sempre bem-vindo context_instance=RequestContext(request) na declaração. No mais, basta editar sua template mais básica (normalmente a que todos os templates herdam) com um código como este:
{% if messages %}
{% for message in messages %}
- {{ message }}
{% endfor %}
{% endif %}Esta lista (que de preferência deve ser tratada com um CSS adequado) irá exibir, sempre que existir, uma lista das mensagens registradas para aquele usuário até aquele momento. As mensages contidas nesta lista serão exibida apenas uma vez, já que elas são excluídas exatamente após a exibição. E uma outra sugestão sobre elas é que se crie um JavaScript com timeout, assim, você pode exibir as mensagens por um tempo definido e ocultá-las depois.
Mostrando mensagens para usuários anônimos
Usuários anônimos são aqueles que não logaram no sistema. Mensagens para esses usuários são necessárias, até mesmo para que esses se registrem. O Django não dispõe desse recurso, mas é possível resolver de algumas formas diferentes, como em [2].
A minha forma de resolver isso foi:
- Criar uma variável de contexto com o nome 'messages' que substitui a variável padrão do sistema. Ela retorna as mensagens de uma variável de sessão criada com esse propósito caso o usuário não esteja autenticado;
- Criar uma função para se registrar mensagens, que da mesma forma registra a mensagem para o usuário autenticado ou para a variável de sessão.
Veja como ficou:
context.py
from django.conf import settings
def context_processors(request):
ret = {}
if not request.user.is_authenticated() and request.session.get('anonymous_user_messages', []):
ret['messages'] = [x for x in request.session.get('anonymous_user_messages', [])]
request.session['anonymous_user_messages'] = []
return retEste módulo deve ser registrado na setting TEMPLATE_CONTEXT_PROCESSORS, assim por exemplo:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'apps.utils.context.context_processors',
)Função para registro de mensagens
def post_message(request, message):
if request.user.is_authenticated():
request.user.message_set.create(message=message)
else:
request.session.setdefault('anonymous_user_messages', [])
request.session['anonymous_user_messages'].append(message)Agora nós mudamos o código visto lá no início para ficar da seguinte forma:
def excluir(request, cliente_id):
try:
Cliente.objects.get(id=cliente_id).delete()
post_message(request, _('Cliente excluido com sucesso'))
except Cliente.DoesNotExist, e
post_message(request, _('Cliente nao encontrado'))
return HttpResponseRedirect('/clientes/')Observações finais
Você deve ter notado o _(...) nas mensagens exibidas. Isso é feito para se aproveitar o recurso de internacionalização do Django. Você pode optar por remover esta parte da sintaxe ou fazer a seguinte importação:
from django.utils.translation import ugettext as _Links relacionados
| [1] | http://www.djangoproject.com/documentation/authentication/#messages |
| [2] | http://www.djangosnippets.org/snippets/319/ |
Marinho Brandão