使用SQL查询填充WTForms SelectField

rob*_*ert 0 python mysql sqlite flask wtforms

我想用此查询返回的行填充WTForms SelectField:

cur.execute("SELECT length FROM skipakke_alpin_ski WHERE stock > 0")
Run Code Online (Sandbox Code Playgroud)

该查询返回具有不同类型滑雪板的滑雪板长度的行。cur.fetchall()返回以下元组:

[(70,), (75,), (82,), (88,), (105,), (115,), (125,), (132,), (140,), (150,), (160,), (170,)]
Run Code Online (Sandbox Code Playgroud)

我将如何将这些数字添加到中SelectField,以便每个滑雪板长度成为其自己的可选选择?如果我手动完成此操作,则将执行以下操作:

ski_size = SelectField('Ski size', choices=['70', '70', '75', '75'])
Run Code Online (Sandbox Code Playgroud)

...对于所有不同的长度,依此类推。

Pra*_*epb 5

在一个我使用过的项目中,如下所示:

楷模

class PropertyType(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    title = db.Column(db.String(255), nullable=False)

    def __repr__(self):
        return str(self.id)
Run Code Online (Sandbox Code Playgroud)

和形式

from wtforms.ext.sqlalchemy.fields import QuerySelectField

class PropertyEditor(Form):
    property_type = QuerySelectField(
        'Property Type',
        query_factory=lambda: models.PropertyType.query,
        allow_blank=False
    )
    //Other remaining fields
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


rob*_*ert 0

我通过执行以下操作成功解决了这个问题:

def fetch_available_items(table_name, column):
    with sqlite3.connect('database.db') as con:
        cur = con.cursor()
        cur.execute("SELECT length FROM skipakke_alpin_ski WHERE stock > 0")
        return cur.fetchall()

class SkipakkeForm(Form):
    alpin_ski = SelectField('Select your ski size', choices=[])

@app.route('/skipakke')
def skipakke():
    form = SkipakkeForm

    # Clear the SelectField on page load
    form.alpin_ski.choices = []        

    for row in fetch_available_items('skipakke_alpin_ski', 'length'):
        stock = str(row[0])
        form.alpin_ski.choices += [(stock, stock + ' cm')]
Run Code Online (Sandbox Code Playgroud)