Eu...
Sou Igor Dutra Sobreira, 20, estudante de Sistemas para Internet no CEFET-PB, e desenvolvedor Python, Django.
Quando as condições estão boas e não tenho muito trabalho, estou velejando de Windsurf.
Recentes
- MySQL-python no Mac OS
- Properties no Python 2.6
- mod_wsgi no OSX
- Django 1.0!
- Promoção Efetividade.net / BR-Linux
- Auto-complete no Django
Categorias
- Pessoal
[4]
- Django
[7]
- Python
[6]
- Jython
[1]
- Eventos
[2]
- Java
[1]
- Gedit
[1]
- Linux
[2]
- PHP
[1]
- Gentoo
[1]
- Mac
[2]
- WSGI
[1]
- MySQL
[1]
Histórico
- Dezembro de 2008
- Agosto de 2008
- Julho de 2008
- Junho de 2008
- Maio de 2008
- Abril de 2008
- Março de 2008
- Fevereiro de 2008
- Janeiro de 2008
Comentários 
- Milton [ Envolva-se no mundo Django ]
- Henrique [ Construtores e Destrutores em Python e PHP 5 ]
- willem [ Django 1.0! ]
- Tiago Bastos [ Novo usuário Gentoo! ]
- Mayron Cachina [ Auto-complete no Django ]
Links
Mensagens para os usuários no Django
- Publicado em: 13/02/2008 22:37h
Ultimamente tenho usado muito a aplicação de autenticação do Django. Mas não estava muito satisfeito com o sistema de mensagens para os usuários que é oferecido. Na verdade a intenção é ser realmente bem simples, vejamos um exemplo:
Foi adicionado uma mensagem para o usuário, assim podemos criar uma fila das últimas ações executadas pelo mesmo. Só que o método para acessar essas mensagens é o get_and_delete_messages():
e no template, assumido que esteja usando RequestContext, ficaria assim:
pois o RequestContext define no template a variável messages, que são as mensagens do usuário logado.
Mas como o próprio nome do método já diz, quando as mensagen são acessadas, elas são removidas. Eu não gostei muito disso, pelo fato de o usuário só poder ver as últimas ações uma única vez, além de que não tem um campo de data no model Message, pra mostrar o dia e hora daquela ação.
Daí decidi reinventar a roda, e fazer um sisteminha de mensagens com essas características.
Eu fiz as mensagens acopladas a um perfil que eu criei pra o usuário do django, e não vou detalhar como se criar um perfil para seu User, veja mais aqui(lá no final do capítulo) e aqui.
Bem, basicamente é esse model:
Onde a classe UserProfile, é minha classe que extende o User da aplicação contrib.auth do Django.
Daí eu adicionei um método na classe UserProfile:
A intenção é a seguinte: sempre ter um número máximo de 'ultimas ações' do usuário, então esse método keep_settings() recebe um parâmatro opcional(valor default é 10), que vai ser o número máximo de ações que ele vai permitir na tabela. É mais um método pra "limpar" as ações antigas.
Um exemplo de uso:
Aí eu adiciono uma ação relacionada com meu usuário, e o método keep_settings() vai garantir que terá no máximo 10 "ultimas ações", caso tenha mais de 10, ele remove as mais antigas e deixa apenas as 10 mais recentes.
E no template ficaria assim:
Assim eu mostro a hora que a ação foi executada e deixo sempre um histórico de 10 ou mais últimas ações. Pra deletar todas poderia chamar o método keep_actions(0) passando zero como parâmetro.
def alterar_foto(request):
# executa o código da view aqui....
request.user.message_set.create(message=u'Foto alterada')
return render_to_response('usuarios/dados.html',
context_instance=RequestContext(request))
Foi adicionado uma mensagem para o usuário, assim podemos criar uma fila das últimas ações executadas pelo mesmo. Só que o método para acessar essas mensagens é o get_and_delete_messages():
mensagens = user.get_and_delete_messages()
e no template, assumido que esteja usando RequestContext, ficaria assim:
{% for message in messages %}
{{ message }}
{% endfor %}
pois o RequestContext define no template a variável messages, que são as mensagens do usuário logado.
Mas como o próprio nome do método já diz, quando as mensagen são acessadas, elas são removidas. Eu não gostei muito disso, pelo fato de o usuário só poder ver as últimas ações uma única vez, além de que não tem um campo de data no model Message, pra mostrar o dia e hora daquela ação.
Daí decidi reinventar a roda, e fazer um sisteminha de mensagens com essas características.
Eu fiz as mensagens acopladas a um perfil que eu criei pra o usuário do django, e não vou detalhar como se criar um perfil para seu User, veja mais aqui(lá no final do capítulo) e aqui.
Bem, basicamente é esse model:
class Action(models.Model):
user = models.ForeignKey(UserProfile)
action = models.CharField(max_length=200)
pub_date = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.action
class Meta:
ordering = ('-pub_date',)
db_table = 'auth_user_profile_action'
Onde a classe UserProfile, é minha classe que extende o User da aplicação contrib.auth do Django.
Daí eu adicionei um método na classe UserProfile:
from django.contrib.auth.models import User
class UserProfile(models.Model):
# meus campos extras
user = models.ForeignKey(User, unique=True)
# mais alguns método aqui, como o __unicode__, a class Meta, class Admin, etc
def keep_actions(self, maximum=10):
actions = self.action_set.count()
if actions > maximum:
extras = self.action_set.all()[maximum:actions]
for extra in extras:
extra.delete()
A intenção é a seguinte: sempre ter um número máximo de 'ultimas ações' do usuário, então esse método keep_settings() recebe um parâmatro opcional(valor default é 10), que vai ser o número máximo de ações que ele vai permitir na tabela. É mais um método pra "limpar" as ações antigas.
Um exemplo de uso:
def adicionar_foto(request):
# codigo normal da view...
profile = request.user.get_profile()
profile.action_set.create(action=u'Foto adicionada')
profile.keep_actions()
profile.save()
# termina a view normalmente....
Aí eu adiciono uma ação relacionada com meu usuário, e o método keep_settings() vai garantir que terá no máximo 10 "ultimas ações", caso tenha mais de 10, ele remove as mais antigas e deixa apenas as 10 mais recentes.
E no template ficaria assim:
{% for action in request.user.get_profile.action_set.all %}
{{ action.pub_date|date:"d/m/Y H:i" }} - {{ action }}
{% endfor %}
Assim eu mostro a hora que a ação foi executada e deixo sempre um histórico de 10 ou mais últimas ações. Pra deletar todas poderia chamar o método keep_actions(0) passando zero como parâmetro.
- Categorias: Django |
- Por: Igor Sobreira |
- 0 comentários
