本文介绍在 flask 中如何从列表页(如申请人报告页)点击某位申请人姓名,跳转至详情页并动态加载其专属数据,核心是利用 url 查询参数安全传递标识字段(如手机号),并在目标路由中查询数据库渲染对应记录。
在 Flask Web 开发中,实现“列表页 → 详情页”的数据联动是常见需求。你已成功在 applicant-report 列表页中遍历并展示申请人报告(reports),并通过内层循环匹配 applicant 表获取姓名。但当前链接 是静态的,无法区分点击的是哪位申请人——关键在于将唯一标识(如手机号)作为 URL 参数传递过去。
修改你的模板链接,将 a.phone 动态注入 URL 的查询字符串中:
{% for report in reports %}
{% for a in applicant %}
{% if a.phone == report.applicant_phone %}
{{ a.name }}
{% endif %}
{% endfor %}
O: {{ (report.op * 100) | round(1) }}%
C: {{ report.co * 100 | round(1) }}%
E: {{ report.ex * 100 | round(1) }}%
A: {{ report.ag * 100 | round(1) }}%
N: {{ report.ne * 100 | round(1) }}%
{% endfor %}? 提示:为避免重复嵌套循环影响性能,建议在后端视图中预先关联 reports 与 applicant(例如使用 SQLAlchemy join 或 relationship),再一次性传入模板。但当前方案可快速验证逻辑。
在 Flask 路由中,使用 request.arg
s.get() 获取 URL 中的 phone 参数,并执行精确查询:
from flask import Flask, render_template, request
from your_app.models import Applicant, Report # 替换为实际模型路径
from your_app import db # 替换为实际 db 实例
@app.route('/applicant-report')
def applicant_report():
phone = request.args.get('phone')
# 安全校验:确保参数存在且非空
if not phone:
return "Error: Applicant phone number is required.", 400
# 查询申请人(假设 Applicant 模型有 phone 字段)
applicant = db.session.query(Applicant).filter_by(phone=phone).first()
if not applicant:
return "Error: Applicant not found.", 404
# 可选:同时查出该申请人的最新报告(增强健壮性)
report = db.session.query(Report).filter_by(applicant_phone=phone).first()
return render_template('applicant-detail.html', applicant=applicant, report=report)class Applicant(db.Model):
# ...
phone = db.Column(db.String(20), index=True) # 添加 index=True点击姓名后,浏览器跳转至类似 /applicant-report?phone=13800138000 的地址,后端精准查出该申请人及其报告数据,并渲染到 applicant-detail.html 模板中——真正实现“所见即所得”的单记录详情页。
此模式简洁、标准、无状态,是 Flask 中页面间轻量数据传递的推荐方案。