首页 > 解决方案 > 为什么不从插入烧瓶中获取数据?

问题描述

我正在尝试将一个表中的多个数据插入到另一个表中,但它没有从 HTML 中获取数据,我尝试了几种方法,我也尝试将数字作为变量并直接插入,但它不起作用。

这就是我想要做的,2 个表给我带来了一个值,并将它们插入到一个名为数量的表中,该表有 2 个 id,只有 3 个字段,产品的 id、count 和 id 在哪里,但是当我尝试插入数据,页面只重新加载。

在此处输入图像描述

Python

if request.method == 'POST':
    try:
        dcont = request.form['dcont']
        ids = request.form['ids']
        cn   = request.form['cn']
        with sql.connect("DRIVER={SQL Server}; SERVER=AUS_COMPUTO02\SQLEXPRESS; DATABASE=WEBSERVICE; Trusted_Connection = yes;") as con:
            cur = con.cursor()
            cur = con.execute("INSERT INTO dbo.DETALLECONTEO  VALUES (?,?,?)", (dcont,ids,cn))               

            cur.commit()
            msg = "Successfully added"
            print(cur)
            print(dcont,ids,cn)
    except:
        con.rollback()
        msg = "error inserte la operacion nuevamente"


    finally: 
        # con.close()
        return render_template ('result.html')

return render_template('new.html', prov=prov, cnt=cnt, ind=ind )

HTML


    <div class="jumbotron">
        <div class="form-group">

                <form class="form-inline my-2 my-lg-0" action="{{ url_for('new') }}" class="form-control" class="w-auto p-3">
                    <select  name='prove' class="form-control mr-sm-2"  aria-label="Search" >
                              <option value="0"> Selecione su Proveedor </option> 
                               <br action="{{ url_for('new') }}" method='POST'>
                                  {% for p in prov %}
                                <option value="{{ p.ID }}" > {{ p.DESCRIPCION }} </option> 
                                {% endfor %}
                                </select>
        <button class="btn btn-outline-success my-2 my-sm-0" type="submit" >Seclet</button> 
    </form>
        </div>


    <div class="form-group">

        <form class="form-inline  my-lg-0" action="{{ url_for('adt') }}" method='POST'>
            <table class="table" class="form-control">
                    <thead>
                      <tr>
                        <th scope="col">Codigo</th>
                        <th scope="col">Descipcion</th>
                        <th acope="col">Cantidad</th>
                      </tr>
                    </thead>
                    <tbody>
                    {% for c in cnt %}
                      <tr>
                        <td >{{ c.codigo }}</td>
                         <td>{{ c.descripcion }}</td>

                         <td > <input name='cn'  id='cn' type="number" class="form-control"></td>

                         <td><select name='dcont' id='dcont'>
                           {% for i in ind %}
                           <option value=" {{i.Conteo}}"> {{i.Conteo}} </option>
                            {% endfor %}
                          </select>
                        </td>
                         <td> <select name='ids' id='ids'>
                           <option value="{{c.id}}"> {{c.id}} </option>
                         </select>
                        </td>

                      {% endfor %}
                    </tr>
                    </tbody>
                  </table>
                    </tbody>
                  </table>              
                  <input class="btn btn-outline-success my-2 my-sm-0" type="submit" ><br>


                  </form>

    </div>
    </div>

标签: pythonflask

解决方案


需要关注的两个主要领域——首先你的表单没有被告知“发布”数据——它将通过默认的“获取”模式发送它,更改表单代码,添加method="post"将解决该问题。

<form class="form-inline my-2 my-lg-0" method="post" action="{{ url_for('new') }}" class="form-control" class="w-auto p-3">

所以现在你的表单数据将被 POST'ed - 并且会触发if request.method == 'POST':逻辑。

您的下一个问题是您的数据以相同命名元素的形式出现——例如,如果您提交了三个条目,您的ids元素将发布:

ids=3
ids=2
ids=6

所以我们需要使用request.form.getlist('ids')来获取该数据,因此您最终会得到表单元素的条目列表:

all_ids = request.form.getlist('ids')
all_cn = request.form.getlist('cn')
all_dcont = request.form.getlist('dcont')

现在,如果我们查看可能提交的数据:

>>> print(all_ids)
['3','2','6']
>>> print(all_dcont)
['A','B','C']
>>> print(all_cn)
['X','Y','Z']

但是我们需要将它们作为行来处理——插入到我们的数据库中,这样我们就可以将它们压缩在一起以形成数据的“行”:

rows = zip(all_ids, all_dcont, all_cn)

所以现在我们有:

>>> print(rows)
['3','A','X'], ['2','B','Y'], ['6','C','Z']

我们可以遍历它(有很多方法可以做到这一点,我们会保持简单)以创建要执行的 SQL 语句:

for entry in rows:
    query_ids = entry[0]
    query_dcont = entry[1]
    query_cn = entry[2]
    ...
    cur = con.execute("INSERT INTO dbo.DETALLECONTEO  VALUES (?,?,?)", (query_dcont,query_ids,query_cn))               
    ...

推荐阅读