基于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
相关产品推荐
相关产品推荐

