sqlite Flask Web应用程序:如何使用多个复选框筛选数据库记录?

chhkpiq4  于 2023-04-21  发布在  SQLite
关注(0)|答案(1)|浏览(219)

我正在开发一个CRUD Flask Web应用程序,它允许安排卡车约会。我能够创建,更新和删除约会,但我很难从数据库中检索特定的数据。
我想实现的是有三个复选框,每个复选框代表一种可以发货的物料。当用户选中一个或多个复选框并单击提交按钮时,我希望应用程序只在表中显示与所选物料对应的约会。
我通过修改app.py中的index()函数实现了过滤功能。下面的代码运行,但它一次只对一个选定的材料起作用:

@app.route('/', methods=['GET', 'POST'])
def index():
    search_material = request.args.get('material_filter')
    appts = appts_db.query.filter_by(material=search_material) \
        .order_by(appts_db.pickup_date).all()

    return render_template('index.html', appts=appts)

在index.html中,我有三个复选框和一个提交按钮:

<form action="/" method="GET">
    <label>Select a material:</label><br>
    <input type="checkbox" name="material_filter" id="HCl_filter" value="HCl">
    <label for="HCl">HCl</label><br>
    <input type="checkbox" name="material_filter" id="Caustic_filter" value="Caustic">
    <label for="Caustic">Caustic</label><br>
    <input type="checkbox" name="material_filter" id="Bleach_filter" value="Bleach">
    <label for="Bleach">Bleach</label><br>
    <input type="submit" value="Filter Appointments">
</form>

<h3>Appointment List:</h3>
<table>
    <tr>
        <th>Carrier</th>
        <th>Material</th>
        <th>Pickup Date [YYYY-MM-DD]</th>
    </tr>

    {% for appt in appts %}
        <tr>
            <td>{{ appt.carrier }}</td>
            <td>{{ appt.material }}</td>
            <td>{{ appt.pickup_date }}</td>
        </tr>
    {% endfor %}
</table>

需要进行哪些更改才能允许选择多个材质并在表格中显示这些材质?

8yparm6h

8yparm6h1#

需要做两个改变才能使其生效。
首先,request.args.get只会从表单数据中检索一个值。这通常是可以的,但如果表单有多个输入具有相同的name属性,则不行。在这种情况下,我们必须使用request.args.getlistlist的形式获取所有值。
其次,filter_by方法不能表示从同一属性的值列表中进行选择。在这种情况下,我们希望将.filter与属性的.in_方法结合使用。
因此,路由应该如下所示:

@app.route('/', methods=['GET', 'POST'])
def index():
    # Get values for all of the material_filter inputs.
    search_materials = request.args.getlist('material_filter')
    # Select all rows that match the inputs.
    appts = appts_db.query.filter(appts_db.material.in_(search_materials)) \
        .order_by(appts_db.pickup_date).all()
    return render_template('index.html', appts=appts)

相关问题