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 user. Afim 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