(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。