我正在尝试将 FullCalendar 与 Flask 一起使用。我希望当在日历页面上单击某个日期时,它可以根据该日期重定向到“日”页面。现在我只是希望它重定向到一个日期页面,在顶部显示该日期,一旦我开始工作,我将添加更多格式。
我正在使用 url_for 重定向到日期页面,但它似乎没有将日期传递给网址。它只是转到“404 url not found”页面,并且该 url 不包含日期,它只是“localhost:5000/day/”,而我期望它是“localhost:5000/day/2023-03” -09' 或选择的任何日期。
我尝试在单击日期时将日期记录到控制台并且有效。我还尝试手动访问 localhost:5000/day/2023-03-09 ,这也将我带到我期望的页面。我可以看到问题是日期没有过去,但我不确定为什么会这样。非常感谢任何帮助!
这是 cal.html 页面:
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8' />
<script src='https://cdn.jsdelivr.net/npm/[email protected]/index.global.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
dateClick: function(info) {
date = info.dateStr
window.location.href = {{ url_for('cal.day', date=date) }}
},
});
calendar.render();
});
</script>
</head>
<body>
<div id='calendar'></div>
</body>
</html>
这是我的routes.py:
from flask import render_template, Blueprint
cal = Blueprint('cal', __name__, template_folder='templates', static_folder='static',
static_url_path='/cal/static')
@cal.route('/', methods=['GET'])
def calendar():
return render_template('cal.html')
@cal.route('/day/<date>', methods=['GET', 'POST'])
def day(date):
date=date
return render_template('day.html', date=date)
day.html 是:
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8' />
</head>
<body>
<h1>{{date}}</h1>
</body>
</html>
你不能指望 Flask/python 块能够读取 JS 变量(在本例中为
date
),其中 a) 来自不同的语言和运行时环境,b) 直到 python 之后才设置代码已经执行了。
显然,让 Flask 正确生成 URL 路由(而不是将其硬编码到 JS 中)很有用,但是直到 Python 代码运行之后你才能知道要使用的最终日期字符串。
解决此问题的方法是将占位符值放入 python 生成的 URL 字符串中,然后在 dateClick 回调运行时使用 JavaScript 将占位符文本替换为真实的日期字符串。
我不是一个普通的Python或Flask用户,所以我希望我的语法是正确的,但即使没有,希望你能看到基本的想法:
dateClick: function(info) {
date = info.dateStr;
url = '{{ url_for('cal.day', date='###') }}';
url = url.replace("###", date);
window.location.href = url;
},