sábado, 24 de janeiro de 2009

Parte 5 - Integrando o cadastro aos usuários do Django


Neste tópico, mostrarei um dos muitos recursos do Django em detalhes: a Integração do cadastro do projeto ao usuários Django.

Vamos primeiro entender do que se trata. Cadastro é uma das muitas aplicações que geralmente temos em todos os projetos, e muita das vezes, os usuários que se cadastrarem tem acesso privilegiado à algumas seções. Para restringir o acesso não autorizado ao conteúdo controlado, era necessário controlar em todas as páginas se o usuário estava logado, se tinha permissão de fazer àquela requisição, etc.
No Django há uma forma fácil de fazer isso. Vamos ao código. Crie sua aplicação cadastro:

python manage.py startapp cadastro


E deixe o model da seguinte forma:






O relacionamento da classe cadastro recém criada e a de usuários do Django ocorre na linha 11, onde temos uma FK para a classe User, importada na linha 2.

Outra coisa interessante, é a linha 3, onde importamos a lista de estados brasileiros provida pelo próprio Django. Utilizo esta lista na linha 25 para prover uma escolha no campo estado da classe cadastro.

Abaixo da classe meta que vimos nos posts anteriores, temos um método muito importante. A def save é a responsável por fazer a persistencia dos dados no banco. O que estou fazendo nesta classe é simplemente sobrescrevendo ela, de forma a funcionar como preciso.

Quando um objeto é adicionado ao banco, o método save é chamado e instancia um objeto de uma classe, setando os valores passados para cada respectivo atributo.

Caso for sobrescrever a def save, é necessário prever as duas situações: quando um objeto for inserido ou quando for alterado. Em ambos os casos, o o save é chamado.

Para testar qual caso estaremos lidando basta fazer o teste da linha 36:

if not self.id:

Se não existir conteudo dendo do atributo id do objeto atual, o mesmo estará sendo inserido ao banco de dados, caso contrário, alterado.


Neste exemplo utilizaremos o email como usuário. Como o usuário do Django tem que ser único, farei alguns tratar isso. Na linha 37, é feito uma busca no banco de cadastro para verificar se o email já existe no sistema.

c = Cadastro.objects.filter(email=self.email).count()

Caso o email existir (linha 38), levantaremos uma exceção EmailExistente impedir o cadastro.

Veremos como utilizar as excessões mais a frente.

Nas linhas 41 à 47, é feito uma verificação para saber se o usuário já existe. Caso existir, o mesmo é atribuído ao objeto u, caso contrário, é criado um novo usuário com base no email e senha fornecidos e atribuido ao objeto u. Em ambos os casos, o objeto u é salvo e a FK para a classe User é setada com o mesmo.


Para alteração (linhas 48 à 52), basta setar os atributos da classe user com os novos dados forncecidos.


Após este tratamento, será chamado o método save original para fazer a persistência, passando os seguintes parâmetros: a classe Cadastro e nosso objeto em questão (self), da seguinte forma:

super(Cadastro, self).save()


As classes CadastroPF e CadastroPJ, são classes normais iguais as que já foram feitas, com apenas uma diferença: não herdam da models.Model, mas sim da classe Cadastro, onde temos os atributos comuns às duas. Crie o restante das classes conforme a figura abaixo:






Crie um admin.py da seguinte forma:




Note que apesar de criar uma administração pra classe Cadastro, esta não está registrada na administração. Desta forma, apenas será inserido um cadastro de pessoa física ou jurídica, e veremos a herança funcionado.



Instale sua aplicação no settings, sincronize o banco, inicie o servidor e faça os testes necessários.


svn: Revision 8
hasta!


4 comentários:

  1. Cara, você está de parabéns!

    Muito Obrigado!

    ResponderExcluir
  2. Opa... achei muito legal esta parte.... Não cheguei a acompanhar as demais partes, mas me ajudou muito esta.

    Abraço

    ResponderExcluir
  3. Amigo estar ótimo seu tutrial mais no meu deu erro em EmailExistente ? Ele pede para criar uma classe ... mais no seu tuto não estar criada o que fazer ?

    ResponderExcluir
    Respostas
    1. Amigo, essa classe vc deve usar alguma das excessões padrão do django disponíveis em django.core.exceptions, ou criar uma própria para tratar, como por exemplo criar uma arquivo na sua app chamado exceptions.py com o conteúdo do link: http://pastebin.com/m8qdjxh7. No seu models.py vc importa com: from exceptions import SuaExcessao e quando for chamar use: raise SuaExcessao()

      Excluir