Erro ao fazer Update no Flask

Olá, estou tendo problema relacionado ao um problema do flask, estou ultilizando o c-swap, para atualizar o meu tr para o novo campo, porem nada é atualizado. Meu servidor me responde uma resposta 200 com a url correta. La no network ele me responde um código bem sucedido. Porem ele não editado dentro da tr.

O arquivo de form_cliente:

<form class="c-form" 
    
    {% if cliente %}

        action =" {{ url_for('cliente.atualizar_cliente', cliente_id = cliente.id)}}"
        c-swap=".cliente-{{cliente.id}}"
        method="PUT"
        

    {% else %}

        action="{{url_for('cliente.inserir_cliente')}}"
        method="POST"
        c-append="#lista-clientes"

    {% endif %}  
 
    >

   
    <div class="mb-3"> 
      <label class="form-label">Nome</label>
      <input type="text" class="form-control" name="nome" {% if cliente %}value="{{cliente.nome}}"{% endif %}>
    </div>

    <div class="mb-3">
      <label class="form-label">Email</label>
      <input type="text" class="form-control" name="email" {% if cliente %} value="{{cliente.email}}" {% endif %}>
    </div>


    <button type="submit" class="btn btn-primary">
      {% if cliente %} 

            Salvar

      {% else %}

           Criar

      {% endif %}
    </button>
  </form>

O arquivo de item_cliente:

   <tr id="cliente-{{cliente.id}}">
    
    <th scope="row">{{ cliente.id}}</th>
    <td>{{cliente.nome}}</td>
    <td>{{cliente.email}}</td>
    <td>
        <button class="btn btn-primary" 
            c-get="{{url_for('cliente.form_edit_cliente',cliente_id=cliente.id)}}"
            c-target="#form-cliente">
            Editar
        </button>


        <button class="btn btn-danger" 
            c-delete="{{url_for('cliente.delete_cliente',cliente_id=cliente.id)}}"
            c-remove-closest="tr">
                Deletar
        </button>
    </td>


</tr>
def atualizar_cliente(cliente_id):
    cliente_editado = None
    # obter dados do formulario de edição
    data = request.json

    #obter o usuario pelo id 
    for c in clientes :
        if c['id']==cliente_id:
            c['nome'] == data['nome']
            c['email'] == data['email']
            cliente_editado = c  

    # editar usuario
    return render_template('item_cliente.html',cliente = cliente_editado)

Meu console me retorna este erro

cru.js:1 Uncaught (in promise) TypeError: Cannot set properties of null (setting ‘outerHTML’)
at HTMLFormElement. (cru.js:1:3225)

Minha rota, aparentemente não tem nada de errado, mas quando clico em salvar minha Tr não é atualizada, alguem poderia me ajudar plis ?

Link do repositório: GitHub - LucasMaciel7/CRUD-FLASK: CRUD FLASK

1 curtida

Olá @Lucas_Maciel tudo bem?

Verifiquei seu código e entendi os 2 problemas que estão afetando o seu projeto.

  1. No atributo c-swap você esta usando .cliente-{{cliente.id}} porem no <tr> está usando id=.
  2. Na função de atualizar_cliente na rota de cliente, dentro do na hora de atualizar as informações do cliente com o que vem da requisição, você usou == e não =.

Vamos às modificações

1. Correção c-swap

No arquivo form_cliente.html, o c-swap você precisa apontar para um elemento existente, então ao invés de buscar a class, altere para buscar id.

Esse é o c-swap atual:

c-swap=".cliente-{{cliente.id}}"

Porem a sua TR usa um ID:

<tr id="cliente-{{cliente.id}}">

Altere o c-swap para apontar para o id da <tr>:

c-swap="#cliente-{{cliente.id}}"

2. Correção da rota atualizar_cliente

Aqui você cometeu um erro super comum ao confundir == com =.

O == é o operador de igualdade, quando queremos verificar se algo é igual a algo. Exemplo:

for c in clientes:
    if c['id'] == cliente_id:
        # ...

Porém, no momento de atualizar a variável c com os atributos que estão vindo da requisição, você usou novamente o ==, ao invés do =. Veja:

# Realiza o update das informações de um cliente
@cliente_route.route('/<int:cliente_id>/update',methods=['PUT'])
def atualizar_cliente(cliente_id):
    cliente_editado = None
    # obter dados do formulario de edição
    data = request.json

    #obter o usuario pelo id 
    for c in clientes :
        if c['id']==cliente_id:
            c['nome'] == data['nome'] # <-------- erro ao usar  ==
            c['email'] == data['email'] # <-------- erro ao usar ==
            cliente_editado = c  # <-------- aqui você acertou kkk

    # editar usuario
    return render_template('item_cliente.html',cliente = cliente_editado)

Para resolver esse problema, basta você usar o = apenas, para atribuir o valor do data no cliente:

# ...
for c in clientes :
    if c['id']==cliente_id:
        c['nome'] = data['nome'] # <---- correto, usando =
        c['email'] = data['email'] # <---- correto, usando =
        cliente_editado = c 
# ...

Espero ter ajudado! Abraços