Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Erro na validação de formulário

Inserir um e-mail no meu formulário com o formato "pedro.com". Eu esperava um erro, no entanto, o perfil foi criado. O método is_valid() não seria o responsável por identificar esse tipo de erro?

# -*- coding: utf-8 -*-
from django import forms
from django.contrib.auth.models import User

class RegistrarUsuarioForm(forms.Form):
    nome = forms.CharField(required=True)
    email = forms.CharField(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('Usuário 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)
9 respostas

Pelo o que eu me lembro, a validação é apenas se os campos são obrigatórios. Se quiser validar e-mail ou outra coisa, terá que aplicar uma expressão regular. Django é bem flexível nisso.

Uma solução rápida é validar o campo via HTML5.

No campo do e-mail, troque o type para email no lugar de text.

solução!

Não professor, a validação ocorre com o email também. :)

Geovane, acho que tu só esqueceu de colocar o forms.EmailField do email.

email = forms.EmailField(required=True)

Ah sim! Se for com forms.EmailField ele faz isso automático para você.

Geovane, a Vânia esta corretíssima!

Certo, Vânia. Agora, não sei estou correto... Essa atividade é de um exercício do capítulo. Veja o enunciado:

Em nossa tela de cadastro de usuários, se entrarmos com um e-mail inválido somos notificados pelo Django através do mesmo formulário, porém perdemos todas as informações que já havíamos digitado.
Podemos melhorar a experiência do usuário exibindo os dados inseridos anteriormente para o usuário. Implemente esta solução, dica: eles já estão disponíveis para o template, apenas não os utilizamos. Utilize {{ }} para acessá-los no atributo value dos inputs do template.

Exemplo: {{form.nome_empresa.value}}

Para testar, digite um e-mail inválido como xyz.com. Se houver um erro no e-mail, o formulário continuará exibindo os dados do formulário, mas claro, ainda inválido. Isso evita que o usuário tenha que preencher o formulário novamente.

Bom, ocorre que não há notificação no próprio formulário, mas sim um página de erro. Não sei se está correto. Sei que estudei um capítulo sobre tratamento de erros, para deixá-los mais amigáveis, mas não tenho certeza se o resultado que tenho é o esperado...

ValueError at /registrar/
The view usuarios.views.RegistrarUsuarioView didn't return an HttpResponse object. It returned None instead.

Coloca o código do usuarios.views.RegistrarUsuarioView

Acredito que seja algum problema no return do post dessa classe

# -*- coding: utf-8 -*-

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

# Create your views here.

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

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

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

        #verifica se eh valido
        if form.is_valid():
            dados_form = form.data

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

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

            #grava no banco
            perfil.save()

            #redireciona para index
            return redirect('index')

            #so chega aqui se nao for valido
            #vamos devolver o form para mostrar o formulário preenchido
            return render(request, self.template_name, {'form' : form})

Teu último return tá identado errado. Ele tem que tá na altura do if

Verdade, obrigado de novo!