sexta-feira, 5 de novembro de 2010

Acrescentando métodos ou atributos ao objeto User do Django

O Django é um framework para desenvolvimento web em python muito bem conceituado. Facilita o desenvolvimento web entre outras coisas que podem ser encontradas no site oficial do framework.
Estou usando ele para desenvolver um projeto relativamente grande, com muitas funcionalidades (atualmente em fase de desenvolvimento). Um dia desses tive que modificar o modelo de dados do sistema para adicionar mais um tipo de usuário. No inicio o sistema tinha apenas um tipo de perfil que era o de estudante, porém tive que adicionar o profile do professor no sistema. Quando um novo usuário vai entrar no sistema ele escolhe se é estudante ou professor, dependendo da escolha o sistema cria um tipo de profile diferente. Ai foi onde tive problema, pois o Django já é preparado para trabalhar com sistemas que utilizam profile, porém sistemas com apenas um profile (um tipo de usuário). Procurei bastante na internet sobre isso e acabei achando uma solução interessante, porém não me lembro mais qual foi o blog gringo que achei sobre isso (vou pesquisar e achando eu atualizo aqui). Adicionei este código no arquivo urls.py :

from django.contrib.auth.models import User

class UserGetProfileExtension:
    def _get_profile(self):
        if not hasattr(self, '_UserGetProfileExtension__cached_profile'):
            try:
                if hasattr(self, 'student'):
                    self.__cached_profile = self.student
                elif hasattr(self, 'professor'):
                    self.__cached_profile = self.professor
            except:
                self.__cached_profile = None
        else:
            self.__cached_profile = self._UserGetProfileExtension__cached_profile
        return self.__cached_profile
    profile = property(_get_profile)
User.__bases__ += ( UserGetProfileExtension, )

Agora para pegar o profile do usuário basta continuar usando:

user.profile

Espero que isso possa ajudar muita gente. Como as referências estão em inglês, este conteúdo em português é interessante. Até logo e depois vou colocando mais soluções interessantes.

Nenhum comentário:

Postar um comentário