1
resposta

__init__() missing 1 required positional argument: 'email'

Estou fazendo um projeto e estou usando como base o mesmo projeto passado pelo professor, criei uma tabela de clientes e inseri alguns campos, populei a tabela e funcionou normalmente. No momento que eu vou na minha aplicação para realizar alguma alteração ou inserção de um novo cliente a mensagem de erro é apresentada: "init() missing 1 required positional argument: 'email'". Procurei em alguns fóruns, mas não consegui resolver. Essa é a minha função de atualizar e a inserir_cliente do arquivo aplicaocao.py,

@app.route('/atualizar', methods=['POST',])
def atualizar():
    nome_cliente = request.form['nome_cliente']
    razao_social = request.form['razao_social']
    cpf_cnpj = request.form['cpf_cnpj']
    insc_estadual = request.form['insc_estadual']
    celular = request.form['celular']
    email = request.form['email']
    cliente = Cliente(nome_cliente, razao_social, cpf_cnpj, insc_estadual, celular, email, id_cliente=request.form['id_cliente'])
    cliente_dao.salvar(cliente)
    return redirect(url_for('index'))

@app.route('/inserir_cliente', methods=['POST',])
def inserir_cliente():
    nome_cliente = request.form['nome_cliente']
    razao_social = request.form['razao_social']
    cpf_cnpj = request.form['cpf_cnpj']
    insc_estadual = request.form['insc_estadual']
    celular = request.form['celular']
    email = request.form['email']
    cliente = Cliente(nome_cliente, razao_social, cpf_cnpj, insc_estadual, celular, email)
    cliente_dao.salvar(cliente)
    return redirect(url_for('index'))

Esse é a minha classe cliente, do arquivo models.py

class Cliente:
    def __init__(self, nome_cliente, razao_social, cpf_cnpj, telefone, insc_estadual, celular, email, id_cliente=None):
        self.id_cliente = id_cliente
        self.nome_cliente = nome_cliente
        self.razao_social = razao_social
        self.cpf_cnpj = cpf_cnpj
        self.telefone = telefone
        self.celular = celular
        self.insc_estadual = insc_estadual
        self.email = email

O meu dao.py está assim:

SQL_INSERE_CLIENTE = 'INSERT into cliente (nome_cliente, razao_social, cpf_cnpj, insc_estadual, celular, telefone, email) values(%s, %s, %s, %s, %s, %s, %s)'
SQL_DELETA_CLIENTE = 'DELETE FROM cliente where id_cliente = %s'
SQL_CLIENTE_POR_ID = 'SELECT id_cliente, nome_cliente, razao_social, cpf_cnpj, insc_estadual, celular, telefone, email from cliente where id_cliente = %s'
SQL_USUARIO_POR_ID = 'SELECT id_usuario, nome_usuario, controle from usuario where id_usuario = %s'
SQL_ATUALIZA_CLIENTE = 'UPDATE cliente SET nome_cliente=%s, razao_social=%s, cpf_cnpj=%s, insc_estadual=%s, telefone=%s, celular=%s, email=%s where id_cliente = %s'
SQL_BUSCA_CLIENTE = 'SELECT id_cliente, nome_cliente, razao_social, cpf_cnpj, insc_estadual, celular, telefone, email from cliente'

class ClienteDao:
    def __init__(self, db):
        self.__db = db

    def salvar(self, cliente):
        cursor = self.__db.connection.cursor()

        if (cliente.id_cliente):
            cursor.execute(SQL_ATUALIZA_CLIENTE, (cliente.nome_cliente, cliente.razao_social, cliente.cpf_cnpj, cliente.insc_estadual, cliente.telefone, cliente.celular, cliente.email, cliente.id_cliente))
        else:
            cursor.execute(SQL_INSERE_CLIENTE, (cliente.nome_cliente, cliente.razao_social, cliente.insc_estadual, cliente.cpf_cnpj, cliente.telefone, cliente.celular, cliente.email))
            cliente.id_cliente = cursor.lastrowid
        self.__db.connection.commit()
        return cliente

def listar(self):
        cursor = self.__db.connection.cursor()
        cursor.execute(SQL_BUSCA_CLIENTE)
        clientes = traduz_cliente(cursor.fetchall())
        return clientes

    def busca_por_id(self, id_cliente):
        cursor = self.__db.connection.cursor()
        cursor.execute(SQL_CLIENTE_POR_ID, (id_cliente,))
        tupla = cursor.fetchone()
        return Cliente(tupla[1], tupla[2], tupla[3], tupla[4], tupla[5], tupla[6], tupla[7], id_cliente=tupla[0])

    def deletar(self, id_cliente):
        self.__db.connection.cursor().execute(SQL_DELETA_CLIENTE, (id_cliente, ))
        self.__db.connection.commit()

1 resposta

Oi Yan, como vai? Espero que esteja tudo bem com você ^-^

O log: "init() missing 1 required positional argument: 'email'"., é porque está faltando parâmetros na instanciação da classe Cliente. Observe que a classe cliente possui 8 argumentos, porém 1 é opcional(id_cliente), certo? Lembrando também que a ordem é importante. Ou seja, se o telefone vem antes da inscrição estadual, assim devemos colocar, respeitando a ordem.

Observe esse trecho na rota de atualizar:

cliente = Cliente(nome_cliente, razao_social, cpf_cnpj, insc_estadual, celular, email, id_cliente=request.form['id_cliente'])

Nesse caso, não foi passado o parâmetro telefone após o cpf_cnpj.

Já na rota de inserir o mesmo erro ocorre, não foi passado o parâmetro telefone.

Para corrigir ambos os erros, basta passar na instanciação o parâmetro telefone obtido no form.

Qualquer coisa estou por aqui.

Abraços e 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