微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确使用新值更新外键?

如何解决如何正确使用新值更新外键?

我一直在尝试建立一个网络来检查学生的出勤率。我的目标是在网页上获取一间教室的学生名单

用户类别:

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),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的下拉列表中选择一个选项来更新外键,但是我找不到合适的解决方案,因此决定尝试另一种方法。现在已经创建了一个新表单,然后在网页上看起来还不错。但是该代码实际上在内部无法正常运行,并带来了一些问题。

表格:

class SelectClassroomForm(FlaskForm):
    name = StringField('Name')
    year = StringField('Year')
    classroom = SelectField('Classroom',choices=Classroom.get_classroom(),)
    submit = SubmitField('Add')

尝试更新外键:

@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 %}

(很抱歉,我尝试查找方法后未着色的代码却在我自己的页面上失败了)

无论如何,这里的网页显示了应该的学生列表,但是当我单击“更新”按钮时,问题就出现了。我该如何解决,然后使用新的外键成功更新学生的信息?任何帮助将不胜感激,谢谢。

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。