首页 > 解决方案 > 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: enter image description here

The values are correct, but the formatting isn't This is the outcome of print(vendCompChoices):

(('',), ('ABC',), ('qw',), ('qfadas',), ('eqwe',), ('asdas',), ('wqeq',))

Please help

标签: pythonmysqlflaskflask-wtforms

解决方案


首先导入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')

推荐阅读