1
resposta

Login Erro

percebi que o login é feito via email, porém quando tento criar uma conta com os mesmos usernames, a conta não é criada.Sei que há um filter que pega o username pelo e-mail, mas gostaria de saber como fazer um login no django de forma 100% pelo e-mail.

1 resposta

Olá Antônio, como você está?

Peço desculpas pela demora em obter um retorno.

O backend de autenticação padrão do Django usa o nome de usuário para autenticar o usuário. No entanto, uma forma prática de sanar isso, é usar o e-mail como username no ato do cadastro, no entanto, o recomendável é que tenha um username e caso esse username já exista na base de dados, você pode sugerir outros ou então, retornar ao usuário que aquele username já está em uso, como foi mostrado na aula.

Essa técnica de sugestões de username é muito utilizada em redes sociais, como por exemplo: Twitter, Instagram, dentre outros. A implementação de uma lógica que atenda esse requisito consiste em capturar todos os usernames existentes no banco e gerar username diferentes dos existentes, seja concatenando números, letras, underscores, dentre outros. Abaixo, uma função que pode ser adicionada na view.py de usuários para cumprir com esse objetivo:

def gerador_de_usernames(username):
    quantidade_de_sugestao = 0
    contador = 0
    usernames_existentes = User.objects.only("username")

    while quantidade_de_sugestao < 3:
        possivel_username = f"{username}{contador}"
        for user in usernames_existentes:
            if user.username == possivel_username:
                break
        else:
            quantidade_de_sugestao += 1
            yield possivel_username
        contador += 1

Já na função de cadastro podemos retornar essas sugestões quando o username já estiver em uso:

        if User.objects.filter(username=nome).exists():
            sugestao_de_usernames = [username for username in gerador_de_usernames(nome)]
            messages.error(request, f'Nome de usuário já cadastrado. Sugestões: {(", ".join(sugestao_de_usernames))}')
            return redirect('cadastro')

Como resultado, teremos algo similar ao apresentado abaixo:

Imagem com fundo branco, onde possui um retângulo vermelho escrito: Nome de usuário já cadastrado. Sugestões: rafael0, rafael1, rafael2

Vale ressaltar também, que na aplicação é mostrado “Nome Completo”, porém, essa label é referente ao “Nome de Usuário” e trocar esse rótulo pode ajudar o usuário a compreender melhor o que é pedido, pois caso o usuário adicione o nome completo, pode ser custoso escrevê-lo posteriormente. O username serve como um “apelido” para evitar escritas longas.

A título de curiosidade, caso ainda sim queira colocar o campo e-mail como fator principal de autenticação, recomendo a leitura do artigo abaixo que explicita sobre usuários customizados (CustomizeUser) e elucida sobre campos adicionais na autenticação:

Espero ter ajudado.

Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software