You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Flask单选按钮实现SQLite数据库查询的技术求助

解决Flask表单参数传递与动态查询的衔接问题

1. 修正表单提交路由逻辑

假设你的表单类为BreakfastForm,调整首页路由,确保表单提交后参数能传递到/results:

from flask import Flask, render_template, request, redirect, url_for
from forms import BreakfastForm  # 导入你的自定义表单类
from models import db, BreakfastRecommendation  # 导入数据库模型

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-custom-secret-key'
db.init_app(app)

@app.route('/', methods=['GET', 'POST'])
def index():
    form = BreakfastForm()
    if form.validate_on_submit():
        # 提取表单提交的三个参数
        mood = form.mood.data
        meal_duration = form.meal_duration.data
        diet_type = form.diet_type.data
        # 重定向到结果页并携带参数
        return redirect(url_for('results', 
                               mood=mood, 
                               duration=meal_duration, 
                               diet=diet_type))
    return render_template('index.html', form=form)

2. 实现/results路由的动态查询

在结果页路由中接收参数,完成数据库过滤查询:

@app.route('/results')
def results():
    # 从URL查询字符串中获取参数
    mood = request.args.get('mood')
    duration = request.args.get('duration')
    diet = request.args.get('diet')
    
    # 执行精确匹配查询
    recommendations = BreakfastRecommendation.query.filter(
        BreakfastRecommendation.mood == mood,
        BreakfastRecommendation.meal_duration == duration,
        BreakfastRecommendation.diet_type == diet
    ).all()
    
    # 将查询结果传入模板
    return render_template('results.html', recommendations=recommendations)

3. 调整模板的表单与结果展示

  • 首页模板(index.html):确保表单提交逻辑正确:
<form method="POST">
    {{ form.hidden_tag() }}
    <!-- 心情单选组 -->
    <div>
        {{ form.mood.label }}<br>
        {% for option in form.mood %}
            {{ option }} {{ option.label }}<br>
        {% endfor %}
    </div>
    <!-- 用餐时长单选组 -->
    <div>
        {{ form.meal_duration.label }}<br>
        {% for option in form.meal_duration %}
            {{ option }} {{ option.label }}<br>
        {% endfor %}
    </div>
    <!-- 饮食类型单选组 -->
    <div>
        {{ form.diet_type.label }}<br>
        {% for option in form.diet_type %}
            {{ option }} {{ option.label }}<br>
        {% endfor %}
    </div>
    <button type="submit">获取早餐推荐</button>
</form>
  • 结果页模板(results.html):循环渲染查询结果:
<h1>你的专属早餐推荐</h1>
{% if recommendations %}
    {% for item in recommendations %}
        <div class="rec-item">
            <p>用餐时间:{{ item.meal_time }}</p>
            <p>推荐食物:{{ item.food }}</p>
            <p>搭配饮品:{{ item.drink }}</p>
        </div>
    {% endfor %}
{% else %}
    <p>暂无匹配的早餐方案,请调整选项重试</p>
{% endif %}

核心注意点

  • 确保数据库模型BreakfastRecommendation的字段(mood、meal_duration、diet_type等)与表单参数类型完全匹配(比如均为字符串类型)。
  • 上述代码采用PRG(Post/Redirect/Get)模式,可避免用户刷新页面重复提交表单的问题。
  • 检查WTForms字段的定义,确保字段名称与路由中提取的参数名一致。

内容的提问来源于stack exchange,提问作者lemonfruit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:51:18