如何使用从<select>
预填充的HTML flask - render_template
下拉列表。
这是来自flask-jinja2的<select>
下拉列表。
<div>
<select class="test-default" id="testTime">
{% for option in options %}
<option value={{ option }}>{{ option }}</option>
{% endfor %}
</select>
</div>
test.html
中的脚本,
function fetch_test_data(){
let test = $("#testTime").val();
axios({
method:"get",
url:"/test",
params: {
test
}
}).then(function (response) {
$(document.body).html(response.data)
});
}
还有test.py
文件-带有应用程序路由,还有options
用于下拉菜单。
@app.route('/test', methods=["GET"])
@login_required
def transactions_view():
options = ["0","7","14","30"]
return render_template("test.html", options=options)
在上述情况下,如何使用selected
属性显示所选值。
当选择的值, 正确的值将返回到烧瓶中并返回。但是下拉式图表/列表显示的是第一个值而不是所选值?
我尝试过的事情:
对于定义的下拉菜单,我可以得到dropdown
select
。
defined-dropdown
-供参考
<div>
<select class="test-default" id="testTime">
<option value=0>today</option>
<option value=7>week</option>
<option value=14>fortnight</option>
<option value=30>month</option>
</select>
</div>
{{ time }}
我可以使用上面的下拉菜单:
<div>
<select class="test-default" id="testTime">
<option value=0 {% if time == 0 %} selected="selected" {% endif %}>today</option>
<option value=7 {% if time == 7 %} selected="selected" {% endif %}>week</option>
<option value=14 {% if time == 14 %} selected="selected" {% endif %}>fortnight</option>
<option value=30 {% if time == 30 %} selected="selected" {% endif %}>month</option>
</select>
</div>
从test.py返回{{ time }}
的地方
@app.route('/test', methods=["GET"])
@login_required
def transactions_view():
time = (request.args.get("test"))
return render_template("test.html", time=time)
答案 0 :(得分:0)
axios使用更新的 time 参数获取响应,但是您将需要加载响应(即更新的HTML)以查看更新的时间。
您可以如下所示更新 fetch_test_data 函数,以在下拉值更改时加载HTML响应。
function fetch_test_data(){
let test = $("#testTime").val();
axios({
method:"get",
url:"/test",
params: {
test
}
}).then(function (response) {
$(document.body).html(response.data)
});
}
如果您不需要使用axios,而您只是想更新时间,则下面的代码将无需发送请求即可做到这一点。
<span id=timelabel>Default Time</span>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
var label = document.getElementById('timelabel');
var dropdown = document.getElementById('testTime');
$("#testTime").on("change",function (evt) {
label.textContent = dropdown.value;
})
</script>
答案 1 :(得分:0)
您必须将transactions_view()
中的选定时间传递给模板,并在渲染期间测试每个选项的值。
首先,在test.py
中,您必须像这样修改transactions_view()
:
@app.route('/test', methods=["GET"])
@login_required
def transactions_view():
options = (
(0, 'today'),
(7, 'week'),
(14, 'fortnight'),
(30, 'month'),
)
default_time = 0
selected_time = int(request.args.get('time', default_time))
return render_template("test.html", options=options, selected_time=selected_time)
在这里,我们将options
变量作为键-标签对的元组,并且selected_time
变量保存从GET
请求中选择的时间值或默认值。这两个变量都已传递给render_template
函数,因此我们可以在模板文件中访问它们。
在test.html
模板文件中,您必须像这样修改for
循环:
<div>
<select class="test-default" id="testTime">
{% for time, label in options %}
<option value="{{ time }}" {% if time == selected_time %}selected="selected"{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</div>
在这里,我们测试每个选项的time
值是否为所选时间,并相应地设置selected
属性。
答案 2 :(得分:0)
在我看来,我们应该避免让我们的html /渲染逻辑泄漏到我们的路由/控制器处理程序中。因此,对于上面的示例,您应该只对模板html进行更改。最后,我相信javascript是比使用jinja条件更好,更干净的实现。
<!-- /templates/time.html -->
{%
set time_lookup = {
0: "Today",
7: "Week",
14: "Fortnight",
30: "Month",
}
%}
<div>
<select class="test-default" id="testTime">
{% for option in options %}
<option value={{ option }}>{{ time_lookup[option] }}</option>
{% endfor %}
</select>
</div>
<script>
const urlParams = new URLSearchParams(window.location.search);
// current url and parse our query params "?test=201"
const timeParam = urlParams.get("time") || "0";
// default to 0
const option = document.querySelector("select.test-time option[value=" + timeParam + "]")
// returns <option> HTMLElement where value === timeParam
option.setAttribute("selected", true)
// set <option selected="true"> on HTMLElement
</script>