Flask同页面多表单及复选框数据获取问题求助
Flask多表单使用及复选框取值异常问题
原问题:第二个表单提交报错"Choices cannot be None"
我尝试在Flask同一页面使用两个表单:第一个AvailableBDDForm用于收集信息列出可用数据库,再将这些数据库作为选项传递给第二个ControlerBDDForm的SelectField。
表单定义(views.py)
class AvailableBDDForm(FlaskForm): host = StringField('host', validators=[DataRequired()]) port = StringField('port', validators=[DataRequired()]) user = StringField('user', validators=[DataRequired()]) password = StringField('password', validators=[DataRequired()]) submitAvailableBDD = SubmitField('METTRE A JOUR LA LISTE') next = HiddenField() class ControlerBDDForm(FlaskForm): database = SelectField('database', validators=[DataRequired()]) submit = SubmitField('SE CONNECTER') next = HiddenField() def update_choices(self, databases): self.database.choices = databases
路由代码
@app.route("/analye-bdd/", methods=("GET","POST",)) def analyse_bdd(): availableForm = AvailableBDDForm() controlerForm = ControlerBDDForm() selected_options = [] scroll="" bdd = BDD() available_databases = bdd.lister_bdd() try: if availableForm.validate_on_submit(): print("first if") bdd.update_parameters(availableForm.host.data, availableForm.port.data, availableForm.user.data, availableForm.password.data) available_databases = bdd.lister_bdd() print(available_databases) controlerForm.update_choices(available_databases) if controlerForm.validate_on_submit(): print("helloooo") except Exception as e: print(f"An error occurred: {e}") return render_template( "analyse-bdd.html", title="Analyze", AvailableBDDForm=availableForm, ControlerBDDForm=controlerForm, selected_options=selected_options, scroll_to=scroll, host = bdd.host, port=bdd.port, database=bdd.database, user=bdd.user, password=bdd.password )
HTML表单代码
<form method="POST" action="{{ url_for('analyse_bdd')}}"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> {{ AvailableBDDForm.host(size=30, value=host, class="texteInput")}} {{ AvailableBDDForm.port(size=10, value=port) }} {{ AvailableBDDForm.user(size=30, value=user) }} {{ AvailableBDDForm.password(size=30, value=password) }} {{ AvailableBDDForm.next }} <br> {{ AvailableBDDForm.submitAvailableBDD(class_="btn btn-primary") }} </form> <form method="POST" action="{{ url_for('analyse_bdd')}}"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> <label>Database</label> {{ ControlerBDDForm.database }} {{ ControlerBDDForm.submit(class_="btn btn-primary") }} </form>
问题现象
点击第一个表单的提交按钮(关联AvailableBDDForm)时,终端输出正常,功能可用;但点击第二个表单的提交按钮(关联ControlerBDDForm)时,出现错误An error occurred: Choices cannot be None,且未触发任何调试打印信息。调整验证逻辑后仍无输出。
编辑后新问题:复选框内容仅在第一个表单提交时获取到
原问题已解决,但出现新问题:HTML页面中有一组复选框,通过以下代码获取内容:
for field_name in bdd.analyze_options: if request.form.get(field_name): selected_options.append(request.form.get(field_name)) print("selected options", selected_options) analyze_results = bdd.affichage_analyse(selected_options) print(f"analyze results {analyze_results}")
将此代码放入如下路由后:
@app.route("/analyze/", methods=("GET","POST",)) def analyze(): bdd = BDD() form = AvailableBDDForm(request.form, data=session.get('avail_bdd', {})) selected_options = [] analyze_results = {} scroll_to = "" if form.validate_on_submit(): data = {k:v for k,v in form.data.items() if k in ('host', 'port', 'user', 'password',)} if session.get('avail_bdd', {}) != data: session['avail_bdd'] = data return redirect(url_for('analyze')) if 'avail_bdd' in session: bdd.update_parameters(**session['avail_bdd']) form1 = ControlerBDDForm(request.form, data=session.get('ctrl_bdd', {})) form1.update_choices(bdd.lister_bdd()) if form1.validate_on_submit(): session['ctrl_bdd'] = {k:v for k,v in form1.data.items() if k in ('database',)} print(form1.database.data) scroll_to = "for-scroll-results" for field_name in bdd.analyze_options: if request.form.get(field_name): selected_options.append(request.form.get(field_name)) print("selected options", selected_options) analyze_results = bdd.affichage_analyse(selected_options) print(f"analyze results {analyze_results}") return redirect(url_for('analyze')) return render_template('analyze.html', **locals(), title="Analyze BDD")
问题现象
selected_options仅在点击AvailableBDDForm的提交按钮时才有内容,希望仅在ControlerBDDForm验证通过时执行这部分代码,多次调整代码位置均未解决。
内容的提问来源于stack exchange,提问作者GoodMorningStarshine
相关产品推荐
相关产品推荐

