Flask dynamic WTForms SelectField显示数据库中表格的列标题

Flask dynamic WTForms SelectField显示数据库中表格的列标题,flask,dynamic,sqlalchemy,flask-sqlalchemy,flask-wtforms,Flask,Dynamic,Sqlalchemy,Flask Sqlalchemy,Flask Wtforms,我试图通过flask SQL alchemy将SQL表“School”中的数据提取到SelectField中: 表格: 路线: def register(): if current_user.is_authenticated: return redirect(url_for('home')) form = RegistrationForm() if form.validate_on_submit(): hashed_password = bcrypt.generate_passw

我试图通过flask SQL alchemy将SQL表“School”中的数据提取到SelectField中:

表格:

路线:

def register():
if current_user.is_authenticated:
    return redirect(url_for('home'))
form = RegistrationForm()
if form.validate_on_submit():
    hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
    user = User(username=form.username.data, email=form.email.data, password=hashed_password, school=form.school.data)
    db.session.add(user)
    db.session.commit()
    flash('Your account has been created! You are now able to log in', 'success')
    return redirect(url_for('login'))
return render_template('register.html', title='Register', form=form)
型号:

class School(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
然而,它只是以某种方式显示School.name,以及它在表单中的书写方式。
此外,它应该显示的条目数是正确的3,因为数据库中有3个学校条目

问题在于您的列表理解,它为选择字段构建了值,以及类与类实例上的列属性呈现之间的差异:

school\u choices=[school.id,school.name代表学校中的学校。query.all] 在上述理解中,在每个循环中,学校小写字母“s”是班级学校大写字母“s”的一个实例

在sqlalchemy中,非类实例的类上的列属性的字符串表示返回列的数据库标识,例如:,在本例中为school.name。这是如何生成查询的,例如,尝试运行printSchool.\uuuu table\uuuuu.select,它将从学校打印select school.id、school.name。该查询中的列标识来自字符串化列实例

但是,当我们访问类实例的column属性时,例如school=Schoolname=myschool,我们会得到存储在数据库中的列的值。例如,printschool.school我的学校

查看上面的列表,为数据库中的每个学校实例创建School.id、School.name的元组。请注意,“School”的大写字母“S”,这意味着您在呈现模板时,将呈现数据库中每个学校的列数据库标识的字符串表示形式。答案很简单,只要将您的理解改为:

school\u choices=[school.id,school.name代表学校中的学校。query.all] …但是在一般情况下使用sqlalchemy和python时,理解两者之间的差异是相当重要的

class School(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)