Perfil para o usuário com o model One-To-One no Django

29/09/2017 - 2 min de leitura

DJANGO

Existem basicamente quatro maneiras diferentes para resolver o seu problema, mas eu vou ensinar a mais fácil: um model com link OneToOne para o model de usuário do Django.

Explicação: Um relacionamento 1:1 é um relacionamento em que uma entidade x (um usuário, no nosso caso) possui somente uma instância da entidade y (um perfil) e vice-versa.

Obs: Vou presumir que você já saiba fazer cadastro e login dos usuários.

Tudo pronto? Vamos lá.

Primeiro, você precisa criar um modelo de perfil com uma referência OneToOne para o modelo de usuário. Ficará assim:

from django.db import models
from django.contrib.auth.models import User

class Perfil(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

O parâmetro on_delete quer dizer que quando o usuário for deletado, o seu perfil também será.

Pronto! Foi feito o relacionamento 1:1 com o modelo de usuário. Agora você precisa adicionar os campos que precisa na sua aplicação abaixo de userAfim de explicações, vou adicionar somente um campo para idade.

from django.db import models
from django.contrib.auth.models import User

class Perfil(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    idade = models.IntegerField(default=0)

Importante: Devemos criar métodos de @receiver para que o Django crie um perfil automaticamente ao criar um usuário.

...
from django.dispatch import receiver
from django.db.models.signals import post_save


class Perfil(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    idade = models.IntegerField(default=0)


@receiver(post_save, sender=User)
def criar_perfil(sender, instance, created, **kwargs):
    if created:
        Perfil.objects.create(user=instance)


@receiver(post_save, sender=User)
def salvar_perfil(sender, instance, **kwargs):
    instance.perfil.save()

Não esqueca de fazer o makemigrations e depois o migrate.

Legal! O nosso modelo está finalizado. Agora se você quiser que o perfil também apareça no admin do Django temos que registrá-lo em admin.py.

...
from django.contrib import admin
from .models import Perfil
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin


class PerfilInline(admin.StackedInline):
    model = Perfil
    can_delete = False
    verbose_name_plural = 'perfil'


class UserAdmin(BaseUserAdmin):
    inlines = (PerfilInline, )


admin.site.unregister(User)
admin.site.register(User, UserAdmin)

O perfil aparecerá no final da página do usuário que você clicou.

Salvando dados no perfil

Salvar os dados não é complicado. Vou demonstrar um jeito de fazer isso.

Supondo que tenho dados trazidos de um formulário para cadastrar o perfil do usuário:

...
from django.contrib.auth.models import User

def cadastro(request):
    nome_usuario = request.POST['username']
    email = request.POST['email']
    senha = request.POST['senha']
    idade = request.POST['idade']
    novoUsuario = User.objects.create_user(username=nome_usuario, email=email, password=senha)
    novoUsuario.save()
    novoUsuario.perfil.idade = idade
    novoUsuario.save()
    return alguma coisa :)

Tudo certo, todo pronto! Agora você já sabe fazer um perfil para o usuário da sua aplicação : )

Os arquivos completos estão no gist.

Para esse tutorial usei Python 3.5 e Django 1.11

Compartilhe

Twitter