我正在寻找一种方法来在用户选择并刷新页面(GET 请求)或发送数据(POST 请求)后保留选中的 html 选择器选项。
真正有效的唯一方法是将 localstorage 与 JavaScript 结合使用,但它似乎不适用于 jinja(请参见下面的示例):
<select title='selector' id="interface-output" class="browser-default">
<option id="select" value="select">Select an interface</option>
{% for element in new_list %}
<option value='{{ element }}'>{{ element }}</option>
{% endfor %}
和javascript脚本:
document.getElementById('interface-output').onchange = function() {
localStorage.setItem('selectedtem', document.getElementById('interface-output').value);
};
if (localStorage.getItem('selectedtem')) {
document.getElementById('interface-output').options[localStorage.getItem('selectedtem')].selected = true;
}
它适用于固定选项,但不适用于像这里这样的动态 jinja2 选项。你还有其他方法让它工作吗?提前致谢!
您可以使用本地存储来使用 Jinja 2 动态选项来选择所选的选项值。
这里是一个在 Jinja 2 select 标签中使用本地存储的简单例子。
app.py
:
from flask import Flask, request, render_template, flash
app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
@app.route('/add', methods=['GET', 'POST'])
def add_product():
options = ["Mobile", "Laptop", "Monitor"]
if request.method == 'POST':
product_name = request.form["product_name"]
product_type = request.form["product_type"]
flash(f'New product Added. Name: {product_name}, type: {product_type}')
return render_template('dropdown.html', options=options)
templates/dropdown.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Selected dropdown example</title>
</head>
<body>
<h2>Add new product</h2>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<form action="{{ url_for('add_product') }}"
method="post"
id="product_form">
<label for="product_type">Product type:</label>
<select name="product_type" id="product_type">
{% for element in options %}
<option value='{{ element }}'>{{ element }}</option>
{% endfor %}
</select>
<br>
<label for="product_name">Product name</label>
<input type="text" name="product_name" id="product_name">
<br>
<input type="submit" value="Save" id="save_btn">
</form>
<script>
window.onload = function (event) {
if (localStorage.getItem('selected_type')) {
const selected_type = localStorage.getItem('selected_type');
const dropdown = document.getElementById('product_type');
for (let i = 0; i < dropdown.options.length; i++) {
if (dropdown.options[i].value === selected_type) {
dropdown.options[i].selected = true;
break;
}
}
}
};
const product_form = document.getElementById('product_form');
const save_btn = document.getElementById('save_btn');
save_btn.addEventListener('click', function (event) {
event.preventDefault();
const selected_type = document.querySelector('#product_type').value;
localStorage.setItem('selected_type', selected_type);
product_form.submit();
});
</script>
</body>
</html>
解释:
options = ["Mobile", "Laptop", "Monitor"]
将选项值从 Flask 传递到模板。selected_type
设置了任何值。如果设置了任何值,那么我们将选定的选项值设置为 true。selected_type
的本地存储设置为所选产品类型,然后我们使用form.submit()
方法提交表单。Mobile
) 被选中,因为本地存储中的selected_type
中没有值: