python - Flask WTF Selectfield choices not being displayed properly while fetching from mysql
问题描述
so I am trying to populate Flask form's SelectField from a mysql database. This is the relevant code:
app = flask.Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root@localhost/vshdb?'
app.config['SECRET_KEY'] = 'mysecret'
db = SQLAlchemy(app)
admin = Admin(app)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = ''
app.config['MYSQL_DB'] = 'vshdb'
mysql = MySQL(app)
#Creating a connection cursor
#app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@localhost/vshdb'
class history(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
vendorName = db.Column(db.String(100))
vendorCompany = db.Column(db.String(100))
sopVer = db.Column(db.Numeric)
sopName = db.Column(db.String(100))
entryDate = db.Column(db.Date)
class vendorForm(FlaskForm):
vendorCompany = SelectField('vendorCompany', choices=[], validators=[DataRequired()])
vendorName = SelectField('vendorName', choices=[], validators=[DataRequired()])
sopName = SelectField('sopName', choices=[], validators=[DataRequired()])
sopVer = StringField('sopVer', validators=[DataRequired()])
@app.route('/test')
def test():
form = vendorForm()
cursor = mysql.connection.cursor()
cursor.execute("SELECT DISTINCT vendorCompany from history")
vendCompChoices = cursor.fetchall()
print(vendCompChoices)
form.vendorCompany.choices = [(vC, vC) for vC in vendCompChoices]
return render_template('FlaskForm.html', form=form)
And this is my test html template:
<!doctype html>
<html>
<body>
<form method="POST">
{{ form.csrf_token }}
{{ form.vendorCompany }}
<input type="submit" value="Go">
</form>
</body>
</html>
I am able to get unique values in the Selectfield, but they are not being displayed properly. This is how they are coming:
The values are correct, but the formatting isn't This is the outcome of print(vendCompChoices):
(('',), ('ABC',), ('qw',), ('qfadas',), ('eqwe',), ('asdas',), ('wqeq',))
Please help
解决方案
首先导入QuerySelectField
from wtforms.ext.sqlalchemy.fields import QuerySelectField
然后用查询定义一个函数:
def vendor_name_choices():
return history.query.with_entities(history.vendorCompany).all()
然后修改你的表格
class vendorForm(FlaskForm):
vendorCompany = SelectField('vendorCompany', validators=[DataRequired()], query_factory=vendor_name_choices)
...
经过一些更新,这就是我所做的,除了不同的值部分之外它可以工作:
def vendor_name_choices():
return history.query
class vendorForm(FlaskForm):
vendorCompany = QuerySelectField('vendorCompany', query_factory=vendor_name_choices, validators=[DataRequired()], get_label='vendorCompany')
推荐阅读
- angular - 如何打开组件视图然后从 html 代码中删除按钮标签
- jquery-ui - 下拉箭头的大小比平常小
- carousel - 显示 bulma carousel 中的所有图像
- typescript - 如何实现带剩余参数的接口?
- python - 如何在 Python OpenCV 中检测文本文档图像中的段落是否存在不一致的文本结构
- javascript - 对象数组 - 按顺序返回对象并返回平均排名
- powershell - 如何在 Windows 上创建用户和组之前检查它们是否存在(不是 AD 用户或组)
- distributed-system - 在 REHASHING 期间,如何在基于一致性哈希的数据存储中处理对失败节点的 READ/WRITE 请求?
- java - 无法使用 UIScrollable 和 UISelector 定位元素
- .net - 我在 .net 中的 ElasticSearch 查询速度很慢,有什么建议吗?