Quanto a serialização dos dados(serializers.py
), utilizaremos o código abaixo:
class UsuarioSerializer(serializers.ModelSerializer):
password = serializers.CharField(
style={'input_type': 'password'},
write_only=True,
label="Senha"
)
password_confirm = serializers.CharField(
style={'input_type': 'password'},
write_only=True,
label="Confirme a senha"
)
is_staff = serializers.BooleanField(
label="Membro da Equipe",
help_text="Indica que usuário consegue acessar o site de administração."
)
is_superuser = serializers.BooleanField(
label="SuperUsuário",
help_text="Indica que este usuário tem todas as permissões sem atribuí-las explicitamente."
)
class Meta:
model = Usuario
fields = ('username','email', 'password', 'password_confirm', 'is_staff', 'is_superuser')
extra_kwargs = {'password': {'write_only': True}}
def save(self):
conta = Usuario(
email=self.validated_data['email'],
username=self.validated_data['username'],
is_staff=self.validated_data['is_staff'],
is_superuser=self.validated_data['is_superuser']
)
password = self.validated_data['password']
password_confirm = self.validated_data['password_confirm']
if password != password_confirm:
raise serializers.ValidationError({'password': 'As senhas não são iguais.'})
conta.set_password(password)
conta.save()
return conta
Com esse código, estamos pegando os dados do nosso modelo e após isso, antes de salvar o usuário verificamos se os campos de senha
são iguais. E caso seja, salvamos o usuário e em caso contrário, lançamos uma exceção. O validated_data
serve para que possamos
verificar se a entrada que o usuário digitou é válida, como herdamos da classe AbstractUser
ela internamente já possui esses
métodos de validação. Os campos de senha foram definidos apenas como campo de escrita write_only
, pois não queremos ler dados desse campo.
Agora, no arquivo views.py
, iremos construir o nosso modelo de listagem e o viewset
de usuários:
from escola.models import Usuario
class UsuariosViewSet(viewsets.ModelViewSet):
queryset = Usuario.objects.all()
serializer_class = UsuarioSerializer
class ListaUsuarios(generics.ListAPIView):
def get_queryset(self):
queryset = Usuario.objects.all()
return queryset
serializer_class = UsuarioSerializer
Por fim, vamos ao arquivo urls.py
do nosso projeto(setup
) e adicionaremos uma rota para cadastrar o usuário:
from escola.views import ListaUsuarios, UsuariosViewSet
router = routers.DefaultRouter()
router.register('cadastrar_usuario', UsuariosViewSet, basename='Cadastrar Usuário')
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
path('cadastrar_usuario/', ListaUsuarios.as_view())
]
Antes de testar é necessário excluir o arquivo db.sqlite3
e pasta de migrações. Após a exclusão, refaça as migrations:
python manage.py makemigrations
python manage.py migrate
Caso todas as migrações tenham sido feitas, execute o servidor:
python manage.py runserver
Como resultado deverá ver a rota de cadastro de usuário na página principal:
E ao clicar nessa rota http://localhost:8000/cadastrar_usuario/
, será apresentado o formulário para cadastro de usuário:
Como as rotas para cadastro de aluno, cursos ou matrículas possuem autenticação, ao clicar em uma dessas rotas será pedido as credenciais, basta colocar o e-mail
cadastrado e a senha
que conseguirá realizar as operações do crud.
Qualquer dúvida estou por aqui, tá bom?
Abraços e bons estudos!