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

Flask餐饮订单系统如何通过按钮按日切换渲染对应日期订单

核心问题定位
  • 格式不匹配是查询失败的直接原因:最初代码里用斜杠/分隔日期(格式%d/%m/%Y),后续调整方案里把日期格式改成了横杠-分隔(格式%d-%m-%Y),数据库存储的订单日期是斜杠分隔的字符串,精确查询时字符串不一致,自然匹配不到对应订单,触发无订单的提示分支。
  • 依赖session存日期的设计有状态污染问题:原home路由每次被访问,都会强制把session里的日期重置为当天日期。哪怕timeline路由已经把session里的日期调整到目标日期,只要触发分页跳转、或者页面里的其他链接指向home路由,session的日期就会被强制重置为当天,导致查询的日期和页面显示的日期不一致。
  • 模板链接参数缺失:模板里的分页按钮、日期切换按钮都没有携带当前查看的日期参数,跳转时会丢失当前日期上下文,最终落到默认的当天查询逻辑上。
修复实现方案

整体思路是把查看的日期直接放在URL路径里,不依赖session存储临时状态,保证每次跳转的参数完整可追溯,同时全程统一日期格式和数据库存储规则对齐。

修正后的路由代码

from datetime import datetime, date
from flask import Blueprint, render_template, request, redirect, url_for
from flask_login import login_required
from models import Post

main = Blueprint('main', __name__)
# 全局统一日期格式,和数据库存储格式完全对齐
DB_DATE_FORMAT = "%d/%m/%Y"

@main.route("/home/", defaults={'view_date': date.today().strftime(DB_DATE_FORMAT)})
@main.route("/home/<string:view_date>", methods=['GET', 'POST'])
@login_required
def home(view_date):
    page = request.args.get('page', 1, type=int)
    # 直接基于URL传入的日期查询订单,不再操作session存状态
    posts = Post.query.filter_by(date=view_date).paginate(page=page, per_page=5)
    return render_template('home.html', posts=posts, date=view_date)

@main.route("/timeline/<string:current_date>/<string:when>")
@login_required
def timeline(current_date, when):
    # 基于当前页面的日期做偏移计算
    current_dt = datetime.strptime(current_date, DB_DATE_FORMAT)
    if when == "next":
        target_dt = next_day(current_dt)
    elif when == "prev":
        target_dt = prev_day(current_dt)
    else:
        target_dt = date.today()
    target_date_str = target_dt.strftime(DB_DATE_FORMAT)
    # 重定向到对应日期的首页路由
    return redirect(url_for('main.home', view_date=target_date_str))

修正后的模板关键片段

  • 分页链接必须携带当前查看的日期参数,避免翻页时跳回默认日期
  • 日期切换按钮必须把当前查看的日期作为参数传给时间线路由,保证偏移计算的基础值正确
{# 修正后的分页组件 #}
{% for page_num in posts.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
  {% if page_num %}
    {% if posts.page == page_num %}
      <a class="btn btn-info mb-4" href="{{ url_for('main.home', view_date=date, page=page_num) }}">{{ page_num }}</a>
    {% else %}
      <a class="btn btn-outline-info mb-4" href="{{ url_for('main.home', view_date=date, page=page_num) }}">{{ page_num }}</a>
    {% endif %}
  {% else %}
    ...
  {% endif %}
{% endfor %}

{# 修正后的日期导航按钮 #}
<nav aria-label="Date navigation">
  <ul class="pagination justify-content-center">
    <li class="page-item">
      <a class="page-link" href="{{ url_for('main.timeline', current_date=date, when='prev') }}">Prev Day</a>
    </li>
    <li class="page-item">
      <a class="page-link" href="{{ url_for('main.timeline', current_date=date, when='next') }}">Next Day</a>
    </li>
  </ul>
</nav>
之前调整方案失效的原因
  • 日期格式做了不兼容的修改,斜杠改横杠的变更没有同步对齐数据库的存储值,导致精确查询无结果
  • 跳转链路里没有把日期参数完整传递,前后天计算的基础值、分页跳转的目标值都丢失了当前日期的上下文
  • 仍然依赖session存日期,很容易被其他路由的赋值操作覆盖,出现显示和查询值不一致的“假匹配”问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 16:27:07