Flask下拉列表与数据库同步
来源:互联网 发布:大数据 感知 编辑:程序博客网 时间:2024/06/18 17:00
WTForms 对 HTML 表单控件 <select> 进行 SelectField 包装,从而实现下拉列表。
使用下拉列表有两种情况,
第一种直接下拉选择设定的值,然后将选择的值读取存储。这种情况比较简单,
1.首先,在form.py中定义表单以及SelectField下拉列表
app\main\form.pyclass SmFormAdmin(Form): status = SelectField('按类型查询',validators=[Required()] , choices=[('0', '全部'),('1', '待审核'),('2', '认证成功'),('3', '认证失败')] ) submit = SubmitField('Submit')SelectField 实例必须在其 choices 属性中设置各选项。选项必须是一个由元组组成的列表, 各元组都包含两个元素:选项的标识符和显示在控件中的文本字符串。
2.在路由中读取表单的值,直接使用或者存入数据库
app\main\views.py@main.route('/sm_admin', methods=['GET', 'POST'])@login_requireddef sm_admin(): user = User.query.filter_by(email=current_user.email).first() if user.user_role > 0: <strong>form = SmFormAdmin()</strong> if request.method == '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) ...................................其他列省略 departments=db.relationship('Department', secondary=user_department, backref=db.backref('users',lazy='dynamic'), lazy='dynamic')
在这里学生因为可以转学院,而且学院所以学生和学院是多对多的关系,一般的学生与学院应该是多对一的关系比较简单。(多对多关系后面会有介绍
2.定义表单,需要在初始化函数中对choices赋值
app\main\form.pyclass 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 Department.query.order_by(Department.department).all()] self.cut_department.choices = [(cut_department.id, cut_department.department) for cut_department in Department.query.order_by(Department.department).all()] self.user = user</strong>
choices 列表在表单的构造函数中设定,其值从 Department 模型中获取,使用一个查询按照学院id顺序排列所有学院,元组中的标识符是学院的 id,因为这是个整数,所以在 SelectField 构造函数中添加 coerce=int 参数,从而把字段的值转换为整数。
3.编写路由函数。
由于原来路由函数很复杂,就不贴上来了,只贴关键几句了:
@main.route('/sm', methods=['GET', 'POST'])@login_required@main.errorhandler(404)def sm(): user = User.query.filter_by(email=current_user.email).first() form = SmForm(user)<pre name="code" class="python"> if form.validate_on_submit():....................................省略其他<pre name="code" class="python"> <strong>user.departments.append(Department.query.get(form.pre_department.data)) user.departments.append(Department.query.get(form.cut_department.data))</strong><pre name="code" class="python"> db.session.add(user) db.session.commit() flash('您已提交实名认证申请') return redirect(url_for('.sm_success')) return render_template('sm.html', form=form)
0 0
- Flask下拉列表与数据库同步
- 下拉框与列表框
- 列表控件ListView与下拉列表Spinner
- JS实现单选按钮与下拉列表的值的选择,使与数据库保持一致
- 下拉列表显示数据库对应数据
- 数据库调出显示为下拉列表
- 3级联动下拉列表-数据库版
- 用数据库表填充下拉列表框
- asp 三级数据库联动下拉列表
- ComboBox下拉列表控件链接数据库
- 无限极下拉列表数据库和代码
- 下拉列表在数据库中的存储方式
- Flask 数据库
- flask-数据库
- 下拉列表,单选与多选
- Excel下拉列表与数据筛选
- Js与下拉列表处理问题
- 下拉列表(Spinner)介绍与应用
- 单片机中使用C库函数记录
- Opengl ES 线的三角化
- Android API中被@hide注释的方法引用报错解决
- 《java入门第一季》之面向对象(多态向下转型)
- ExtJS自定义控件 之一:datetimefield控件
- Flask下拉列表与数据库同步
- leetcode.279. Perfect Squares
- 今天经理给我讲了好多东西(spring mvc)
- java底层知识(3)--CPU 高速缓存
- 版本管理
- 创建一个内容提供者Creating a Content Provider——翻译总结自developer.android.com
- Android5.0(L)输入法表情界面㊗和㊙显示框框
- C++程序设计必知:生存期
- equals 与hashCode 的关系