【问题标题】:Flask WTF Selectfield choices not being displayed properly while fetching from mysql从 mysql 获取时,Flask WTF Selectfield 选项未正确显示
【发布时间】:2020-12-14 14:22:22
【问题描述】:

所以我试图从 mysql 数据库中填充 Flask 表单的 SelectField。这是相关代码:

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)

这是我的测试 html 模板:

<!doctype html>  
<html>  
   <body>  
       <form method="POST">
           {{ form.csrf_token }}
           {{ form.vendorCompany }}
           <input type="submit" value="Go">
        </form>
    </body>
</html>

我能够在选择字段中获得唯一值,但它们没有正确显示。他们是这样来的:

值正确,但格式不正确 这是 print(vendCompChoices) 的结果:

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

请帮忙

【问题讨论】:

    标签: python mysql flask flask-wtforms


    【解决方案1】:

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

    【讨论】:

    • 它给了我以下错误:``` sqlalchemy.orm.exc.UnmappedInstanceError: Class 'sqlalchemy.util._collections.result' is not mapped ```
    • 我没有你要测试的代码,但是使用 current_app.app_context,你不能填充choices=[]吗?
    • 我找不到任何使用 current_app.app_context 填充选项的内容
    • 我可以让它工作,但除了不同的部分,你能帮我吗?我已经更新了你上面的答案
    • @RaghavChamadiya 你所说的不同是什么意思?
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2017-05-16
    • 2013-06-16
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多