7
respostas

Problema no If dentro do post da classe RegistrarUsuarioView - aula 11

Boa noite, estou na aula 11 e ao rodar o server e tentar cadastrar o usuário, ele volta para a própria página do registro de usuário. Ele não indica nenhum erro mas também não retorna a página index como era de se esperar... Eu estou usando python 3 então também não tenho certeza se existe alguma diferença.

meu usuarios/forms.py está assim

from django import forms
from django.contrib.auth.models import User


class RegistrarUsuarioForm(forms.Form):
    nome = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    senha = forms.CharField(required=True)
    telefone = forms.CharField(required=True)
    nome_empresa = forms.CharField(required=True)

    def is_valid(self):

        valid = True

        if not super(RegistrarUsuarioForm, self).is_valid():
            self.adiciona_erro('Por favor, verifique os dados informados')
            valid = False

        user_exists = User.objects.filter(username=self.data['nome']).exists()

        if user_exists:
            self.adiciona_erro('Usuario ja existente')
            valid = False

        return valid

    def adiciona_erro(self, message):
        errors = self._errors.setdefault(forms.forms.NON_FIELD_ERRORS, forms.utils.ErrorList())
        errors.append(message)

e meu usuarios/views.py está assim:

from django.shortcuts import redirect
from django.shortcuts import render
from django.contrib.auth.models import User
from django.views.generic.base import View
from perfis.models import Perfil
from usuarios.forms import RegistrarUsuarioForm


class RegistrarUsuarioView(View):
    template_name = 'registrar.html'

    def get(self, request):
        return render(request, self.template_name)

    def post(self, request):
        form = RegistrarUsuarioForm(request.POST)

        if form.is_valid():
            dados_form = form.data

            usuario = User.objects.create_user(dados_form['nome'],
                                               dados_form['email'], dados_form['senha'])

            perfil = Perfil(nome=dados_form['nome'],
                            email=dados_form['email'],
                            telefone=dados_form['telefone'],
                            nome_empresa=dados_form['nome_empresa'],
                            usuario=usuario)

            perfil.save()

            return redirect('index')

        return render(request, self.template_name, {'form': form})

Alguma ideia do que poderia ser? Obrigado pela atenção!

7 respostas

Bom dia! Ele chega a salvar os dados no banco? Digo isso para saber se cai na condição que fará o redirect. Já verificou a indentação? É que as vezes isso gera oum resultado não esperado.

Aguardo seu feedback.

Bom dia! Não salva, botei um print dentro do if para testar se saia e também não saiu nada no prompt.

E verifiquei a indentação mas não encontrei nenhum problema!

Bom, se ele não entra nesse if:

 if form.is_valid():
            dados_form = form.data
           # bla bla bla

É porque o form está inválido. Olhando assim, de relance seu código, não vejo nada de errado nele. Ao menos que você esteja cadastrando um usuário já existente.

Poste o código do template que você usa para cadastrar. A ideia é verificar se há algum problema na exibição da imagem que possa estar omitindo, por exemplo, o cadastro de um usuário já existente.

O arquivo registrar.html está assim:

{% extends "base_usuario.html" %}
{% block body %}
    <form class="form-signin" action="{% url 'registrar' %}" method="post">
        {% csrf_token %}
        <h2 class="form-signin-heading">Crie seu usuário</h2>

        <input id="id_email" name="email" type="text" class="form-control" placeholder="Email *" required>

        <input id="id_nome" name="nome" type="text" class="form-control" placeholder="Nome *" required>

        <input id="id_senha" name="senha" type="password" class="form-control" placeholder="Senha *" required>

        <input id="id_telefone" name="telefone" type="text" class="form-control" placeholder="Telefone">

        <input id="id_nome_time" name="nome_time" type="text" class="form-control" placeholder="Time *" required>

        <hr/>
        {% if form.erros %}
            <div class="alert alert-danger">
                <button type ="button" class="close">&times;</button>
                {{ form.non_field_errors }}
            </div>
        {% endif %}
        <button class="btn btn-lg btn-primary btn-block" type="submit">Registrar</button>
    </form>

{% endblock %}

porém agora rodei o server e está dando erro quando tento registrar, quando vou registrar algo pela primeira vez aparece o seguinte erro:

TypeError at /registrar/ 'email' is an invalid keyword argument for this function

e quando abro novamente a página registrar e tento colocar os mesmos dados aparece o seguinte:

AttributeError at /registrar/ module 'django.forms.utils' has no attribute 'Errorlist'

eu estou usando o Pycharm e ele destaca algumas coisas, por exemplo, em perfis/models.py:

@property
def email(self):
    return self.usuario.email

em @property está sublinhado de vermelho e diz: "unsolved reference 'property' "

em usuarios/forms.py:

    def is_valid(self):
        valid = True
        if not super(RegistrarUsuarioForm, self).is_valid():
            self.adiciona_erro('Por favor, verifique os dados informados')
            valid = False

Em super(RegistrarUsuarioForm, self).is_valid() o "is_valid() está com um destaque e o Pycharm diz :"Unresolved attribute reference "is_valid" for class 'super.

também em usuarios/forms,py:

    def adiciona_erro(self, message):
        errors = self._errors.setdefault(forms.forms.NON_FIELD_ERRORS, forms.utils.Errorlist())
        errors.append(message)

Em forms.utils.Errorlist() o utils também está em destaque e o Pycharm diz "cannot find reference 'utils' in 'init.py'

Não lembro de ter alterado nada da hora que postei a dúvida para agora, por isso fiquei sem entender porque antes quando eu submetia o formulário ele voltava para a mesma página e agora está dando esses erros!

Obrigado pela atenção e desculpe se ficou confuso o texto!

Você mudou alguma coisa do projeto? Vi um campo que não existe no treinamento. Outra coisa, você esta usando exatamente a mesma versão do Django que uso no curso? Se atualizar para uma nova não vai funcionar como esperado.

Por fim, você experimentou baixar o projeto zipado do próximo capítulo e verificar seu código.

O mais importante é saber se você mudou algo e se esta usando a versão homologada por mim no curso. Se esta usando a versão mais recente do Django, terá problemas, muito problemas porque ela mudou.

Eu não uso Pycharm no curso e essas mensagens podem ser falso positivos por ele não esta configurado corretamente para usar o Django. Sugiro que use o Sublime ou outro editor até que você tenha certeza que esteja tudo funcionando.

Tem tanta coisa paralela ao projeto que fica difícil detectar o que é erro dele e o que é de infraestrutura.

a única coisa que mudei foi o nome_empresa para nome_time, porém na pergunta inicial mandei como nome_empresa só para ficar igual ao que foi feito no curso. No caso estou usando a versão mais recente do django e do python, acredito que seja por isso então que está dando esses problemas. Quanto ao download eu fiz sim, porém pelo fato de justamente estar usando a versão mais recente, ele não rodou o server e indicou alguns erros

Se você mudou o name do form de nome_empresa para nome_time terá que mudar também lá no seu código Django. O Django usa o name do input para extrair a informação. Experimente voltar para o nome original e veja se funciona.