(Flask) WTForm 以错误的值呈现
(Flask) WTForm gets rendered with wrong values
我目前正在为一个大学项目开发基于网络应用程序的“数据库浏览器”。
基本上我为数据库的每个关系创建一个站点,用户可以在其中查看数据,另外我希望他们能够添加数据。
为此,我使用 wtforms。我接受输入,用它创建一个简单的“SQL 字符串”并执行它。
为了方便输入,我想使用动态SelectFields。
这是我的建议:
@app.route('/table/fact_angestellte')
def fact_angestellte():
if current_user.is_authenticated:
mycursor.execute("SELECT * FROM dim_rolle WHERE ro_rolle !='Ansprechpartner' AND ro_rolle != 'Teilnehmer';")
choicesRolle = mycursor.fetchall()
form = InsertAngestelltenForm(choicesRolle)
print(form.choicesRolle)
mycursor.execute("SELECT * FROM fact_angestellte INNER JOIN dim_rolle ON fact_angestellte.an_rolle_fk = dim_rolle.ro_id_pk;")
data = mycursor.fetchall()
return render_template('tables/fact_angestellte.html', data=data, form=form)
else:
return redirect(url_for('login'))
表单已成功创建,如果我尝试打印 form.choicesRolle(在适当的时候),它也会在控制台中为我提供正确的输出。但是当我访问我的网站时,SelectField 仍然具有默认值 choicesRolle。
class InsertAngestelltenForm(FlaskForm):
choicesRolle =[]
nachname = StringField('Nachname', validators=[DataRequired()])
vorname = StringField('Vorname',validators=[DataRequired()])
geschlecht = SelectField('Geschlecht', choices=[('maennlich', 'männlich'), ('weiblich', 'weiblich')], validators=[DataRequired()])
postleitzahl = StringField('Postleitzahl | FK', validators=[DataRequired()])
strasse = StringField('Straße und Nummer', validators=[DataRequired()])
rolle = SelectField('Rolle', choices=choicesRolle, validators=[DataRequired()])
submit = SubmitField('Eintrag hinzufügen')
def __init__(self, choicesRolle):
super().__init__()
self.choicesRolle = choicesRolle
print(self.choicesRolle)
所以我的问题是:对象具有正确的属性,但不知何故它们没有“到达”模板。
任何帮助表示赞赏。
问候
根据 WTForms 文档,choices
关键字仅被评估 once。在您的示例中,这意味着它正在评估您在 choicesRolle
class 属性中设置的空数组,这就是传递给 Flask 的内容。您需要在实例化表单之后设置选项,而不是在实例化期间。
在您的表单 class 上,删除整个 __init__
方法、choicesRolle
class 属性以及 [=16] 中的 choices
参数=] 选择字段。然后,在您的 fact_angestellte
视图函数中,在实例化后设置表单的选项,如下所示:
choicesRolle = mycursor.fetchall()
form = InsertAngestelltenForm()
form.rolle.choices = choicesRolle
这应该有用...让我知道。请注意,我不确定从 mycursor.fetchall()
返回的数据是什么,正如您没有真正描述的那样,但是 SelectField 选项需要是一个值列表...默认情况下 WTForms 将每个值强制转换为 unicode。
我目前正在为一个大学项目开发基于网络应用程序的“数据库浏览器”。 基本上我为数据库的每个关系创建一个站点,用户可以在其中查看数据,另外我希望他们能够添加数据。
为此,我使用 wtforms。我接受输入,用它创建一个简单的“SQL 字符串”并执行它。 为了方便输入,我想使用动态SelectFields。
这是我的建议:
@app.route('/table/fact_angestellte')
def fact_angestellte():
if current_user.is_authenticated:
mycursor.execute("SELECT * FROM dim_rolle WHERE ro_rolle !='Ansprechpartner' AND ro_rolle != 'Teilnehmer';")
choicesRolle = mycursor.fetchall()
form = InsertAngestelltenForm(choicesRolle)
print(form.choicesRolle)
mycursor.execute("SELECT * FROM fact_angestellte INNER JOIN dim_rolle ON fact_angestellte.an_rolle_fk = dim_rolle.ro_id_pk;")
data = mycursor.fetchall()
return render_template('tables/fact_angestellte.html', data=data, form=form)
else:
return redirect(url_for('login'))
表单已成功创建,如果我尝试打印 form.choicesRolle(在适当的时候),它也会在控制台中为我提供正确的输出。但是当我访问我的网站时,SelectField 仍然具有默认值 choicesRolle。
class InsertAngestelltenForm(FlaskForm):
choicesRolle =[]
nachname = StringField('Nachname', validators=[DataRequired()])
vorname = StringField('Vorname',validators=[DataRequired()])
geschlecht = SelectField('Geschlecht', choices=[('maennlich', 'männlich'), ('weiblich', 'weiblich')], validators=[DataRequired()])
postleitzahl = StringField('Postleitzahl | FK', validators=[DataRequired()])
strasse = StringField('Straße und Nummer', validators=[DataRequired()])
rolle = SelectField('Rolle', choices=choicesRolle, validators=[DataRequired()])
submit = SubmitField('Eintrag hinzufügen')
def __init__(self, choicesRolle):
super().__init__()
self.choicesRolle = choicesRolle
print(self.choicesRolle)
所以我的问题是:对象具有正确的属性,但不知何故它们没有“到达”模板。 任何帮助表示赞赏。 问候
根据 WTForms 文档,choices
关键字仅被评估 once。在您的示例中,这意味着它正在评估您在 choicesRolle
class 属性中设置的空数组,这就是传递给 Flask 的内容。您需要在实例化表单之后设置选项,而不是在实例化期间。
在您的表单 class 上,删除整个 __init__
方法、choicesRolle
class 属性以及 [=16] 中的 choices
参数=] 选择字段。然后,在您的 fact_angestellte
视图函数中,在实例化后设置表单的选项,如下所示:
choicesRolle = mycursor.fetchall()
form = InsertAngestelltenForm()
form.rolle.choices = choicesRolle
这应该有用...让我知道。请注意,我不确定从 mycursor.fetchall()
返回的数据是什么,正如您没有真正描述的那样,但是 SelectField 选项需要是一个值列表...默认情况下 WTForms 将每个值强制转换为 unicode。