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(即无法访问该值)。
我创建了一个 <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(即无法访问该值)。