【问题标题】:FLASK - Updating Form without updating certain fields causes 400 Bad Request ErrorFLASK - 更新表单而不更新某些字段会导致 400 错误请求错误
【发布时间】:2022-01-19 04:33:04
【问题描述】:

我创建了一个 <form> 来更新 HTML <table> 中的值,但是对于我的下拉表单字段,如果我在单击提交按钮之前不更新它们,它们会抛出此错误:

werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: 
The browser (or proxy) sent a request that this server could not understand. 
KeyError: 'eligible_applicant_category'

换句话说,如果我更改下拉字段中的选择,它会成功更新,但是如果我保持选择不变,则会引发上述错误。

缩小的代码只显示导致错误的下拉字段:

类视图:

class FundingSource(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    eligible_applicant_category = db.Column(db.Text(), nullable=True)
    eligible_cost = db.Column(db.Text(), nullable=True)
    status = db.Column(db.String(100), nullable=True) 
    notes = db.Column(db.Text(), nullable=True)

烧瓶视图:

@main.route("/eligibleCostMaster", methods=['GET'])
def elig_cost():
        all_data = FundingSource.query.all()
        return render_template('eligibleCostMaster.html', title='Eligible Cost Master', fsources=all_data)

@main.route("/updateElig", methods=['GET', 'POST'])
def updateElig():
    if request.method == 'POST':
        my_data = FundingSource.query.get(request.form.get('id'))

        my_data.eligible_applicant_category = request.form['eligible_applicant_category']
        my_data.eligible_cost = request.form['eligible_cost']
        my_data.status = request.form['status']
        my_data.notes = request.form['notes']

        db.session.commit()
        flash("Eligible Cost Updated Successfully")

        return redirect(url_for('main.elig_cost'))

模板(表单)视图:(仅显示下拉表单字段之一的代码

<form action="{{url_for('main.updateElig')}}" method="POST">
     <div class="form-group">
        <label>Eligible Applicant Category:</label>
        <select name="eligible_applicant_category" class="form-control">
            <option name="eligible_applicant_category" disabled hidden selected value="{{row.eligible_applicant_category}}" SELECTED>{{row.eligible_applicant_category}}</option>
            <option value="Federal Department/Agency">Federal Department/Agency</option>
            <option value="Local Department/Agency">Local Department/Agency</option>
            <option value="Locality">Locality</option>
            <option value="Metropolitan City">Metropolitan City</option>
            <option value="State">State</option>
            <option value="State Department/Agency">State Department/Agency</option>
            <option value="Transportation Entity">Transportation Entity</option>
            <option value="Tribe">Tribe</option>
        </select>
     </div>

如果我的问题令人困惑,请告诉我,我对这一切都比较陌生。蒂亚!!

编辑:

解决了问题!!我只需要将标签中的“禁用隐藏选定”更改为“隐藏”

【问题讨论】:

    标签: python html flask


    【解决方案1】:
    werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: 
    The browser (or proxy) sent a request that this server could not understand. 
    KeyError: 'eligible_applicant_category'
    

    这意味着您正在尝试访问 http 请求中不存在的参数。 尝试打印 request.form 对象的内容并检查您尝试访问的字段(eligible_cost、status 等)是否确实存在。

    你也可以通过检查你要访问的http请求参数是否存在来避免这个异常:

    if 'name_of_filed' in request.form:
        my_field = request.form['name_of_filed']
    

    避免异常的另一种可能解决方案是使用form 属性的get 方法。

    my_field = request.form.get('name_of_filed', 'default_value')
    

    默认值 ('default_value') 可以省略,在这种情况下,get 函数将返回值 None 如果该字段不存在

    【讨论】:

    • 是的!我之前尝试过 request.form.get() 解决方案,但是如果我在不更改选择的情况下更新表单,我不会再收到错误,但它会将我的选择值更改为无,如您所说。现在我的问题是,它不只访问我的下拉字段的参数的原因可能是什么?
    【解决方案2】:

    我解决了这个问题!!我只需将标签中的“禁用隐藏选定”更改为“隐藏”,因为“禁用”关键字不允许字段值/属性为 POST(即无法访问该值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2014-03-18
      • 2015-02-27
      相关资源
      最近更新 更多