Flask+MongoDB奖学金查询无结果 技术问题求助
奖学金搜索无结果的问题排查与解决
核心问题1:表单字段名与后端取值不匹配
前端表单里的输入框name属性都是小写开头(category、marks、state、qualification),但后端Flask代码里用的是大写开头的键去取值(request.form.get('Category')),这会导致后端获取到的Category、Marks、State、Qualification全为None。用这些None构建的查询条件,只会匹配MongoDB中对应字段为null的文档,自然查不到数据。
核心问题2:未过滤空查询条件
当某个字段没有有效输入时(比如因上述问题导致的None),你依然将其加入了search_conditions字典。例如'Category': None会让MongoDB只找Category字段为null的文档,而不是忽略这个条件进行搜索。
次要问题:数字输入的处理局限性
表单中Marks和Qualification是text类型,代码里用isdigit()判断是否为数字,但该方法无法识别带小数的数字(比如"85.5"),会被转为0,导致$lte:0的条件可能不符合实际需求。
修正后的代码示例
后端Flask路由修改
@app.route('/search_scholarships', methods=['GET', 'POST']) def search_scholarships(): if request.method == 'POST': # 键与前端表单name完全匹配(小写开头) category = request.form.get('category') marks_input = request.form.get('marks') state = request.form.get('state') qualification_input = request.form.get('qualification') # 处理数字输入,支持小数转整数(可根据需求调整为保留小数) try: marks = int(float(marks_input)) if marks_input else 0 except ValueError: marks = 0 try: qualification = int(float(qualification_input)) if qualification_input else 0 except ValueError: qualification = 0 # 只添加有有效值的查询条件 search_conditions = {} if category: search_conditions['Category'] = category if state: search_conditions['State'] = state if marks > 0: search_conditions['Marks'] = {'$lte': marks} if qualification > 0: search_conditions['Qualification'] = {'$lte': qualification} # 执行查询 scholarships_data = list(scholarships.find(search_conditions)) print("Scholarships data:", scholarships_data) return render_template('results.html', results=scholarships_data) # GET请求返回搜索页面(原代码缺失此逻辑,直接访问路由会报错) return render_template('search.html')
前端表单优化(可选)
将Marks和Qualification的输入类型改为number,避免用户输入非数字内容:
<!DOCTYPE html> <html> <head> <title>Scholarship Search</title> </head> <body> <h1>Scholarship Search</h1> <form method="post" action="/search_scholarships"> <label for="category">Category:</label> <input type="text" name="category" required> <br> <label for="marks">Marks:</label> <input type="number" name="marks" step="any" required> <br> <label for="state">State:</label> <input type="text" name="state" required> <br> <label for="qualification">Qualification:</label> <input type="number" name="qualification" required> <br> <input type="submit" value="Search Scholarships"> </form> </body> </html>
内容的提问来源于stack exchange,提问作者Om Ch
相关产品推荐
相关产品推荐

