首页 > 解决方案 > 为什么 request.method 没有被调用?

问题描述

我有一个只读文本框,它从数据库中预加载值,单击按钮将其值发送到后端中存在的方法以执行DELETEsql 查询。当我单击调用方法request.method但未调用条件的按钮时,会出现问题。它直接进入方法的结束return语句。

@app.route('/home/delete_reminder/<string:id_val>',methods=['GET','POST'])
@is_logged_in
def delete_reminder(id_val):
    if request.method=='POST':
        desc = request.form['description']
        x = desc.split(',')
        cur = mysql.connection.cursor()
        cur.execute('DELETE FROM set_reminder WHERE DATE=%s,SUBJECT=%s,DESCRIPTION=%s',[x[0],x[1],x[2]])
        cur.execute('DELETE FROM recur WHERE RECUR_NEXT=%s',[id_val])
        flash('Reminder Deleted','danger')
        mysql.connection.commit()
        cur.close()
    return redirect(url_for('search_reminder_to_delete'))

这是我的后端代码。

<form method="POST">
        {% for data in value %}
        <div class="form-group">
            <label>Description</label>
            <input type="text" name="description" class="form-control" readonly="true" value="{{data.DATE}},{{data.SUBJECT}},{{data.DESCRIPTION}}">
        </div>
        <a href="/home/delete_reminder/{{data.RECUR_NEXT}}" class="btn btn-warning" name="delete">Delete Reminder</a>
        {% endfor %}
    </form>

这是html部分。

标签: pythonmysqlsqlpython-3.xflask

解决方案


您的按钮不是按钮,而是链接。您没有提交表单。

如果你想这样做,那么你需要让你形成标签:

<form method="POST" action="/home/delete_reminder/{{data.RECUR_NEXT}}">

并将您的按钮切换为提交表单的真实按钮:

<div class="button">
  <button type="submit" class="btn btn-warning">Send your message</button>
</div>

编辑:看到您希望基于循环为您的表单提供多个可能的路线。

您可以尝试使用该formaction属性,尽管并非每个浏览器版本都支持它。

<form method="POST">
{% for data in value %}
    <div class="form-group">
        <label>Description</label>
        <input type="text" name="description" class="form-control" readonly="true" value="{{data.DATE}},{{data.SUBJECT}},{{data.DESCRIPTION}}">
    </div>
    <div class="button">
        <button formaction="/home/delete_reminder/{{data.RECUR_NEXT}}" class="btn btn-warning" type="submit" class="btn btn-warning">Delete Reminder</button>
    </div>
{% endfor %}

但是,这仍然会导致description传递给请求的字段将整个表单中的每个描述都包含在列表中,或者可能只是最后一个作为单个值(我不太记得具有相同的多个输入的行为名称),我认为这不是您所期望的。

老实说,为循环中的每个链接创建一个单独的表单可能是最简单的:

{% for data in value %}
<form method="POST" action="/home/delete_reminder/{{data.RECUR_NEXT}}">
        <div class="form-group">
            <label>Description</label>
            <input type="text" name="description" class="form-control" readonly="true" value="{{data.DATE}},{{data.SUBJECT}},{{data.DESCRIPTION}}">
        </div>
        <div class="button">
            <button class="btn btn-warning" type="submit" class="btn btn-warning">Delete Reminder</button>
        </div>
</form>
{% endfor %}

推荐阅读