FLASK - 更新表单而不更新某些字段会导致 400 错误请求错误

FLASK - Updating Form without updating certain fields causes 400 Bad Request Error

我创建了一个 <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 查看:

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>

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

编辑:

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

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、状态等)是否实际存在。

您也可以通过检查您要访问的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 函数将 return 值 None 如果字段不存在

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