找不到应用程序。在视图函数内部工作或推送应用程序上下文。使用数据库中的数据创建下拉列表

时间:2020-10-25 05:09:02

标签: flask foreign-keys flask-sqlalchemy flask-wtforms

我一直在花费大量时间在互联网上寻找解决此问题的方法。

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, primary_key=True)
    name = db.Column(db.String(20), 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',
                        validators=[DataRequired(), 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')

当我尝试使用上面的代码运行应用程序时,它给了我这个错误消息。 enter image description here

我从一些实验中得出的结论就是这条线

**

CLASSROOM_CHOICES = [((classroom.id,课堂名称)) ClassroomModel.query.all()]

**

之所以引起这种错误,是因为删除的行不再造成任何错误。

我不知道我做错了什么,但我要做的就是给每个学生一个教室ID作为外键,以便在创建单个教室页面时可以利用它。可以在该页面上显示属于教室的学生列表,以管理他们的出勤率。拜托,有人可以引导我度过这个头痛吗?任何帮助将不胜感激

enter image description here

(教室已经通过自己的ID进入数据库,以防万一,它可能会给您提供其他线索)

1 个答案:

答案 0 :(得分:1)

该行: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 ,请确保已将它们导入到此文件中。