Flask下拉列表与数据库同步
Flask下拉列表与数据库同步
WTForms 对 HTML 表单控件 <select> 进⾏ SelectField 包装,从⽽实现下拉列表。
使⽤下拉列表有两种情况,
第⼀种直接下拉选择设定的值,然后将选择的值读取存储。这种情况⽐较简单,
1.⾸先,在form.py中定义表单以及SelectField下拉列表
app\main\form.py
class SmFormAdmin(Form):
status = SelectField('按类型查询',validators=[Required()] , choices=[('0', '全部'),('1', '待审核'),('2', '认证成功'),('3', '认证失败')]    )
submit = SubmitField('Submit')
SelectField 实例必须在其 choices 属性中设置各选项。选项必须是⼀个由元组组成的列表, 各元组都包含两个元素:选项的标识符和显⽰在控件中的⽂本字符串。
子加一笔是2.在路由中读取表单的值,直接使⽤或者存⼊数据库
app\main\views.py
@ute('/sm_admin', methods=['GET', 'POST'])
@login_required
def sm_admin():
user = User.query.filter_by(email=ail).first()
老封神榜演员if user.user_role > 0:
<strong>form = SmFormAdmin()</strong>
hod == 'POST':
if form.validate_on_submit():
<strong>sm_status = form.status.data</strong>      #从表单中读取选择的值
.
........................这⾥直接使⽤了读取的值,使⽤过程省略
return render_template('sm_admin.html', result=result, form=form, pagination=pagination)
return render_template('sm_admin.html', form=form)
else:
return redirect(url_for('.index'))
第⼆种需要同步数据库,⽐如学⽣填资料信息时,下拉列表的学院应该是数据库中学院表⾥的数据。
1.数据模型定义如下:
app\models.py
class Department(db.Model):
__tablename__ = 'departments'
id = db.Column(db.Integer, primary_key=True)
实业公司名称取名大全
department = db.Column(db.String(100))
<pre name="code" class="python">user_department = db.Table('user_department',
db.Column('user_id', db.Integer, db.ForeignKey('users.id'), primary_key=True),
db.Column('department_id', db.Integer, db.ForeignKey('departments.id'), primary_key=True)
)
class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) ...................................其他列省略lationship('Department', secondary=user_department, backref=db.backref('users',lazy='dynamic'), lazy='dynamic')
在这⾥学⽣因为可以转学院,⽽且学院所以学⽣和学院是多对多的关系,⼀般的学⽣与学院应该是多对⼀的关系⽐较简单。(多对多关系后⾯会有介绍
2.定义表单,需要在初始化函数中对choices赋值
app\main\form.py
class SmForm(Form):
农村致富信息................................其他表单类型省略
pre_department = SelectField('原学院:', coerce=int)
cut_department = SelectField('现学院:', coerce=int)
submit = SubmitField('Submit')
<strong> def __init__(self, user, *args, **kwargs):
super(SmForm, self).__init__(*args, **kwargs)
self.pre_department.choices = [(pre_department.id, pre_department.department)
for pre_department in der_by(Department.department).all()]
self.cut_department.choices = [(cut_department.id, cut_department.department)
for cut_department in der_by(Department.department).all()]
self.user = user</strong>
choices 列表在表单的构造函数中设定,其值从 Department 模型中获取,使⽤⼀个查询按照学院id顺序排列所有学
院,元组中的标识符是学院的 id,因为这是个整数,所以在 SelectField 构造函数中添加 coerce=int 参数,从⽽把字段的值转换为整数。
3.编写路由函数。
由于原来路由函数很复杂,就不贴上来了,只贴关键⼏句了:
@ute('/sm', methods=['GET', 'POST'])
@login_required
春节假期2023法定假日几天
@handler(404)
def sm():
user = User.query.filter_by(email=ail).first()
form = SmForm(user)
<pre name="code" class="python">    if form.validate_on_submit(): ....................................省略其他
<pre name="code" class="python">        <strong>user.departments.append((form.pre_department.data))
user.departments.append((form.cut_department.data))</strong><pre name="code" class="python">        db.session.add(user)        db.sessionmit()
flash('您已提交实名认证申请')
南京特
return redirect(url_for('.sm_success'))
return render_template('sm.html', form=form)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。