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