问题描述
from flask_sqlalchemy import sqlAlchemy
db = sqlAlchemy()
目前,我正在尝试建立一个网站来管理学生。我想做的是创建多个学生所属的教室。因此,每个教室将分别有一些学生。
为此,我使用flask_sqlalchemy在文件中创建了一个数据库,然后在下面的另一个模块中创建了两个模块(学生和教室)
class StudentModel(db.Model):
__tablename__ = "students"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(20),nullable=False)
email = db.Column(db.String(80),nullable=False,unique=True)
year = db.Column(db.String(20),nullable=False)
school = db.Column(db.String(20),nullable=False)
classroom_id = db.Column(db.Integer,db.ForeignKey("classrooms.id"))
classroom = db.relationship("ClassroomModel")
class ClassroomModel(db.Model):
__tablename__ = "classrooms"
id = db.Column(db.Integer,nullable=False)
description = db.Column(db.String(100),nullable=False)
students = db.relationship("StudentModel",lazy="dynamic")
然后,添加了一些教室进行测试,直到目前为止还可以。
在创建表格后,这个问题就开始出现了
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField,SelectField
from wtforms.validators import Datarequired,Email,Length,ValidationError
from models import ClassroomModel,StudentModel
YEAR_CHOICES = [("",'<<Choose Student Year>>'),('Year 1','Year 1'),('Year 2','Year 2'),('Year 3','Year 3')]
SCHOOL_CHOICES = [("",'<<Choose Student School>>'),('Yang-san','Yang-san Secondary School'),('Ji-san','Ji-san Secondary School'),('Yong-doo','Yong-doo Secondary School'),('Korea','Korea Secondary School')]
CLASSROOM_CHOICES = [(classroom.id,classroom.name) for classroom in ClassroomModel.query.all()]
def validate_selection(form,field):
if field.data == "":
raise ValidationError("Make sure to choose an option")
class StudentForm(FlaskForm):
name = StringField('Student Name',validators=[Datarequired(),Length(min=2,max=20)])
email = StringField('Student Email',Email()])
year = SelectField('Student Year',choices=YEAR_CHOICES,validators=[validate_selection]
)
school = SelectField('Student School',choices=SCHOOL_CHOICES,validators=[validate_selection]
)
classroom = SelectField('Student Classroom',choices=ClassroomModel.get_all_classroom())
submit = SubmitField('Add Student')
当我尝试使用上面的代码运行应用程序时,它给了我这个错误消息。
我从一些实验中得出的结论就是这条线
**
CLASSROOM_CHOICES = [((classroom.id,课堂名称)) ClassroomModel.query.all()]
**
我不知道我做错了什么,但我要做的就是给每个学生一个教室ID作为外键,以便在创建单个教室页面时可以利用它。可以在该页面上显示属于教室的学生列表,以管理他们的出勤率。拜托,有人可以引导我度过这个头痛吗?任何帮助将不胜感激
(教室已经通过自己的ID进入数据库,以防万一,它可能会给您提供其他线索)
解决方法
该行:CLASSROOM_CHOICES = [(classroom.id,classroom.name) for classroom in ClassroomModel.query.all()]
导致此错误,因为它不在 app上下文中,在该上下文中,应用上下文将是使用app = Flask(__name__)
作为代码的代码的任何部分。装饰器,例如您的路线。
要摆脱该错误,您只需按如下所示修改行即可:
def get_classrooms():
with app.app_context():
db.create_all()
return [(classroom.id,classroom.name) for classroom in ClassroomModel.query.all()]
CLASSROOM_CHOICES = get_classrooms()
此外,如果您在单独的文件中启动了 app 和 db ,请确保已将它们导入到此文件中。