Ir ao conteúdo

Custom User Django

Salve galerinhaaaa, Tudo certo com vocês?

O Django é fornecido com um modelo de usuário interno para autenticação, no entanto, a documentação oficial do Django recomenda o uso de um modelo de usuário personalizado para novos projetos. O motivo é que você deseja fazer alterações no modelo de usuário no futuro – por exemplo, adicionando uma data de nascimento – usando um modelo de usuário personalizado desde o início facilita bastante isso. Mas se não, atualizar o modelo de usuário padrão em um projeto existente do Django é muito, muito desafiador.

Portanto, sempre use um modelo de usuário personalizado para todos os novos projetos do Django. No entanto, o exemplo da documentação oficial não é realmente o que muitos especialistas do Django recomendam usar. Existe uma abordagem muito mais fácil, porém poderosa, para iniciar novos projetos do Django com um modelo de usuário personalizado que eu demonstrarei aqui.

Configuração

Para começar, crie um novo projeto Django a partir da linha de comando.

Para isso vamos criar uma pasta chamada customuser, e utilizar o pipenv para isolar todas as dependências do nosso projeto e depois utilizar o django-admin para iniciar nosso projeto django e depois o startapp para iniciar o app Users.

mkdir customuser && cd customuser

pipenv --three
pipenv install django
pipenv shell

django-admin startproject customuser .
python manage.py startapp users

Observe que não executamos migrate para configurar nosso banco de dados. É importante esperar até criarmos nosso novo modelo de usuário personalizado antes de fazê-lo.

AbstractUser vs AbstractBaseUser

Existe duas formas de criar um Usuário Customizado no django, o AbstractUser e o AbstractBaseUser. Em ambos os casos eles auxiliam na criação do Usuário Customizado, porém ao utilizar o AbstractBaseUser você tem que ter em mente que terá muito, más muito trabalho mesmo, já que ele só fornece a subclasse já as funcionalidades você terá que fazer tudo do ZERO, deferente do AbstractUser que ja te trás muitas funcionalidades e campos padrão do Django.

Criando Usuário Customizado

Primeiro vamos adicionar nossa app Users nas settings da aplicação, então ela ficará assim:

# config/settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "users.apps.UsersConfig", # Novo
]
...
AUTH_USER_MODEL = 'users.CustomUser' # Novo

Agora vamos criar o modelo do usuário customizado

Para nosso exemplo, vou estender o usuário e adicionar o campo UUID.

import uuid

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _


# Create your models here.
class CustomUser(AbstractUser):

    uuid = models.UUIDField(_("User UUID"), editable=False, default=uuid.uuid4)

    @property
    def name(self):
        return "{} {}".format(self.first_name, self.last_name)

    class Meta:
        verbose_name = _("user")
        verbose_name_plural = _("users")
        db_table = "users"

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("CustomUser_detail", kwargs={"pk": self.pk})

Agora vamos customizar os forms de criação e edição dos usuários do Django.

Para isso, crie um arquivo chamado forms.py dentro da app de users.

# users/forms.py
from django import forms
from django.contrib.auth.forms import UserChangeForm, UserCreationForm

from .models import CustomUser


class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = (
            "username",
            "email",
        )


class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = "__all__"

Para finalizar, vamos adicionar o Usuário Customizado disponivel no Admin do Django.

# users/admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model

from .forms import CustomUserChangeForm, CustomUserCreationForm
from .models import CustomUser


# Register your models here.
@admin.register(CustomUser)
class CustomUserAdmin(admin.ModelAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ("email", "name", "is_active")

Agora podemos pegar e criar as migrações e criar a estrutura do banco de dados

python manage.py makemigrations
python manage.py migrate

É útil criar um superusuário que possamos usar para fazer login no administrador e testar o login / logout. Na linha de comandos, digite o seguinte comando e siga as instruções.

python manage.py createsuperuser

Conclusão

Agora que nosso modelo de usuário personalizado está configurado, você pode facilmente e a qualquer momento adicionar campos adicionais a ele. Veja a documentação do Django para mais instruções.

Link para o Repositório com todos os códigos

Comenta ai o que achou da publicação, e comenta tambem se tiver alguma dica de temas para abordar nos próximos posts <3

Publicado emProgramação