Flask 如何正确地用新值更新外键?

Flask 如何正确地用新值更新外键?,flask,web,sqlalchemy,foreign-keys,Flask,Web,Sqlalchemy,Foreign Keys,我一直在尝试建立一个网站来检查学生的出勤情况。我的目标是在网页上列出一个教室的学生名单 用户类别: class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(80), unique=True, nullable=False) name = db.Column(db.String(20), nullable=False) password = d

我一直在尝试建立一个网站来检查学生的出勤情况。我的目标是在网页上列出一个教室的学生名单

用户类别:

class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(80), unique=True, nullable=False)
name = db.Column(db.String(20), nullable=False)
password = db.Column(db.String(60), nullable=False)
image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
occupation = db.Column(db.String(20), nullable=False)
year = db.Column(db.String(20), nullable=False)

classroom = db.Column(db.Integer, db.ForeignKey('classroom.id'))
posts = db.relationship('Post', backref='author', lazy=True)

def __repr__(self):
    return f"User('{self.email}', '{self.name}', '{self.image_file}')"
课堂:

class Classroom(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), unique=True, nullable=False)
    description = db.Column(db.String(80))

    users = db.relationship('User', backref='user', lazy=True)



    @classmethod
    def get_classroom(cls):
        classroom_list = Classroom.query.all()
        return [(classroom.id, classroom.name) for classroom in classroom_list]

    def __repr__(self):
        return f"Classroom('{self.name}', '{self.description}')"
但是,由于最初没有创建教室,因此实际上没有为学生提供与其教室相关的外键,然后默认设置为Null

因此,我打算通过只使用HTML从下拉列表中选择一个选项来更新外键,但我无法找到合适的解决方案,决定用另一种方法进行尝试。现在创建了一个新的表单,然后在网页上看起来还可以。但是代码在内部并没有很好地工作,并且带来了一些问题

表格:

正在尝试更新外键:

@app.route("/students", methods=['GET', 'POST'])
@login_required
def students():
    form = SelectClassroomForm()
    students = User.query.filter(User.year != "I'm not a Student")
    if form.validate_on_submit():
        students.classroom = form.classroom.data[0]
        db.session.commit()
        flash('Successfully Added classroom info to students', 'success')
        return redirect(url_for('students'))
    else:
        flash("something's wrong", 'danger')
    return render_template('students.html', students=students, form=form)
我不确定是上面的代码还是下面的HTML代码阻止了我更新密钥

HTML代码:

{% extends "layout.html" %}
{% block content %}
    <h2>Student List</h2>
    <div class="content-section">
        <div class="table-responsive">
            <table id="mytable" class="table table-bordered table-striped">
                <thead>
                        <th> Name </th>
                        <th> Year </th>
                        <th> Classroom </th>
                </thead>
                <tbody>
                {% for student in students %}
                <tr>
                    <td> {{ student.name }} </td>
                    <td> {{ student.year }} </td>
                    <td>
                        <form method="POST" action="">
                            {{ form.classroom(class="form-control form-control-sm") }}
                        </form>
                    </td>
                </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
        <a class="btn btn-primary btn-sm mt-1 mb-1" href="{{ url_for('students') }}">Update</a>
    </div>
{% endblock content %}
{%extends“layout.html”%}
{%block content%}
学生名单
名称
年
教室
{学生百分比中的学生百分比}
{{student.name}
{{student.year}
{{form.school(class=“form control form control sm”)}
{%endfor%}
{%endblock内容%}
(很抱歉,我试图找出如何使用未着色的代码,但在我自己的页面上失败了)

不管怎么说,这里的网页显示了学生名单,正如它应该是,但当我点击更新按钮,这就是问题出现的时候。我如何解决这个问题,然后用新外键成功更新学生信息?任何帮助都将不胜感激,谢谢


让应用程序将诊断信息(包括完整的错误消息和堆栈跟踪输出)写入日志文件,然后让您的问题包含相关详细信息,而不是简单地显示“有问题”。事实上,除了200之外,没有错误消息,也没有跟踪输出,因此,很遗憾,无法提取更多相关详细信息。在调用
flash
显示“有问题”之前,
print
表单对象(或将
repr(form)
转储到文件)。表单对象应该包含有关验证失败原因的信息。我认为使用“更新”按钮,表单将被忽略,您将发送另一个GET请求。因此,提交时验证将失败,因为它不是POST请求。使用
将更新按钮封装在表单中,以使用表单的方法和操作参数。
{% extends "layout.html" %}
{% block content %}
    <h2>Student List</h2>
    <div class="content-section">
        <div class="table-responsive">
            <table id="mytable" class="table table-bordered table-striped">
                <thead>
                        <th> Name </th>
                        <th> Year </th>
                        <th> Classroom </th>
                </thead>
                <tbody>
                {% for student in students %}
                <tr>
                    <td> {{ student.name }} </td>
                    <td> {{ student.year }} </td>
                    <td>
                        <form method="POST" action="">
                            {{ form.classroom(class="form-control form-control-sm") }}
                        </form>
                    </td>
                </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
        <a class="btn btn-primary btn-sm mt-1 mb-1" href="{{ url_for('students') }}">Update</a>
    </div>
{% endblock content %}