3
respostas

Mensagens de erro/sucesso aparecem na página errada

As mensagens que inseri para o usuário só aparecem nas telas posteriores ou em outra tela.

Por exemplo: Ao tentar fazer login com os dados incorretos, a tela apenas pisca(atualiza) e não aparece a mensagem de erro. Outro exemplo seria na adição de receitas, onde o site só mostra que a receita foi adicionada se o usuário retornar a página de adicionar receitas após já ter adicionado.

imagem da tela de admin retornando as mensagens que deveriam estar na tela do usuário

Função do login com mensagens.

    def login(request):
if request.method == 'POST':
    email = request.POST['email']
    senha = request.POST['senha']

    if campo_vazio(email) or campo_vazio(senha):

        messages.error(request, 'Os campos email e senha não podem ficar vazios')
        return redirect('login')

    if User.objects.filter(email=email).exists():
        nome = User.objects.filter(email=email).values_list('username', flat=True).get()
        user = auth.authenticate(username=nome, password=senha)

        if user is not None:
            auth.login(request, user)
            messages.success(request, 'Login realizado com sucesso.')
            return redirect('dashboard')
        else:
            messages.error(request, 'Login ou senha não está correto. Tente novamente')
            return render(request, 'usuarios/login.html')

return render(request, 'usuarios/login.html')

HTML da tela de login

{% extends 'base.html' %}
{% load static %}
{% block content %}
<!-- Preloader -->
<div id="preloader">
    <i class="circle-preloader"></i>
    <img src="{% static 'img/core-img/pizza.png' %}" alt="">
</div>

{% include 'partials/_busca.html' %}

{% include 'partials/_menu.html' %}

Login

{% include 'partials/_alertas.html' %}
{% csrf_token %}
Email
Senha
{% include 'partials/_footer.html' %}
{% endblock %}

https://github.com/Jumbeba/rafa_receitas

3 respostas

O tópico não esta exatamente no curso correto, mas acredito que quem já chegou aqui pode saber do que estou falando. rsrss

Oi Rafael, tudo bem? Faz sentido que a mensagem de sucesso da receita seja exibida somente na outra página, visto que você concluiu com sucesso e então é redirecionado ao dashboard ou ao admin/receitas. Sobre a mensagem de erro do login, a endentação do else da linha 57 está incorreta, e deve estar na mesma endenteção da linha 49, e ao invés de usar "return render(request, 'usuarios/login.html')" que fará carregar uma nova página, você pode usar o "redirect". Segue o meu código:

        if User.objects.filter(email=email).exists():
            nome = User.objects.get(email=email).username
            user = auth.authenticate(username=nome, password=senha)
            if user is not None:
                auth.login(request, user)
                print('Login realizado com sucesso')
                return redirect('dashboard')
        else:
            print('Usuário não cadastrado')
            messages.error(request, 'Usuário não cadastrado')
            return redirect('login')
    return render(request, 'usuario/login.html')

Oi, Carolina! Tudo bem sim, e contigo? Obrigado pela resposta!

Corrigi o erro e alterei o render para "return redirect('login')", mas, quando alterei a endentação do else, a mensagem de erro deixou de ser exibida, por este motivo, deixei como estava.

Ah, entendi que a mensagem de sucesso deve aparecer depois que a tarefa for realizada, mas o que acontece é que a mensagem de sucesso não aparece na página seguinte, ela aparece depois de navegar um pouco pelo site. Enviei o exemplo da página de admin, mas o que está incomodando é o que está acontecendo na página do usuário.

Estou enviando alguns prints para tentar explicar melhor o que estou tentando explicar.

Mensagem de sucesso exibida após o logout ter sido realizado. Mensagem de sucesso exibida após o logout ter sido realizado

Mensagem de sucesso sendo exibida somente ao acessar a página de edição (neste exemplo, naveguei por 2 páginas antes da mensagem sem exibida. Mensagem de sucesso sendo exibida somente ao acessar a página de edição (neste exemplo, naveguei por 2 páginas antes da mensagem sem exibida