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

求助:如何在Flask中实现下拉选单项点击跳转页面

解决Flask下拉选项点击跳转页面的问题

你遇到的问题核心是前后端代码混淆:Flask的redirect()是后端视图函数中用来返回重定向响应的方法,不能直接写到前端HTML的onclick属性里——前端JavaScript环境根本不认识这个后端函数,所以才会报"redirect未定义"的错误。

下面给出两种可行的解决方案:

方法一:直接给选项添加JS跳转(简单快速)

修改"--Add place--"对应的<option>标签,用前端JavaScript的window.location.href实现跳转:

<option value="" onclick="window.location.href='/add_place'">--Add place--</option>

把/add_place替换成你实际的添加地点页面路由即可。

方法二:监听select的change事件(兼容性更好)

部分浏览器对<option>的onclick支持不佳,更可靠的方式是给整个下拉框添加onchange事件,判断选中项后跳转:

  1. 修改<select>标签,添加事件监听:
<select class="form-select" name="place" onchange="handlePlaceSelect(this)">
  1. 在模板的{% block main %}末尾添加JavaScript代码:
<script>
function handlePlaceSelect(selectElement) {
    const selectedText = selectElement.options[selectElement.selectedIndex].text;
    if (selectedText === "--Add place--") {
        window.location.href = '/add_place';
    }
}
</script>

修改后的完整模板代码

{% extends "layout.html" %}

{% block title %}
    记录跑步
{% endblock %}

{% block main %}
    <div class="container d-flex justify-content-center pt-3">
        <form action="/login" method="post">
            <label for="place">地点</label>
            <select class="form-select" name="place" onchange="handlePlaceSelect(this)">
                <option selected value="">--选择地点--</option>
                {% if places %}
                    {% for place in places %}
                        <option value="{{ place }}">{{ place.name }}</option>
                    {% endfor %}
                {% endif %}
                <option value="">--添加地点--</option>
            </select>
            <hr>
            <div class="mb-3">
                <label for="distance">跑步距离(公里)</label>
                <input autocomplete="off" autofocus class="form-control mx-auto w-auto" name="distance" placeholder="例如:1.234" type="number" min=".001" step=".001">
            </div>
            <div class="mb-3">
                <hr>
                <span>时间</span>
                <hr>
                <label for="hours">小时</label>
                <input class="form-control mx-auto w-auto" name="hours" placeholder="00" defaultValue="0" type="number" max="99" onkeydown="if(event.key==='.'){event.preventDefault();}"  oninput="event.target.value = event.target.value.replace(/[^0-9]*/g,'');">
                <label for="minutes">分钟</label>
                <input class="form-control mx-auto w-auto" name="minutes" placeholder="00" type="number" defaultValue="0" max="59" onkeydown="if(event.key==='.'){event.preventDefault();}"  oninput="event.target.value = event.target.value.replace(/[^0-9]*/g,'');">
                <label for="seconds">秒</label>
                <input class="form-control mx-auto w-auto" name="seconds" placeholder="00" type="number" defaultValue="0" max="59" onkeydown="if(event.key==='.'){event.preventDefault();}"  oninput="event.target.value = event.target.value.replace(/[^0-9]*/g,'');">
                <hr>
            </div>
            <button class="btn btn-primary" type="submit">提交</button>
        </form>
        <script>
        function handlePlaceSelect(selectElement) {
            const selectedText = selectElement.options[selectElement.selectedIndex].text;
            if (selectedText === "--添加地点--") {
                window.location.href = '/add_place';
            }
        }
        </script>
    </div>
{% endblock %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:33:18