Вы можете использовать ajax
с jquery
. ajax
позволит вам общаться с вашим внутренним скриптом и предоставлять данные, соответствующие значению элемента:
data_display.html
<html>
<body>
<div id='keys'>
<table>
<tr>
<th>Item Name</th>
</tr>
{%for item in items%}
<tr>
<td><button id='{{item.item_id}}'>{{item.value}}</button></td>
</tr>
{%endfor%}
</table>
</div>
<div id = 'values'>
<table>
<tr><th>Subitems</th></tr>
{%for item in items%}
<tr>
<td>
<div id = 'subitem_{{item.item_id}}'></div>
</td>
</tr>
{%endfor%}
</table>
</div>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('button').click(function(event) {
var item_id = event.target.id;
$.ajax({
url: "/get_subitems",
type: "get",
data: {item_id: item_id},
success: function(response) {
$("#subitem_"+response.target_id).html(response.html);
},
error: function(xhr) {
//pass
}
});
});
});
</script>
</html>
Затем в приложении создайте маршруты:
from collections import namedtuple
@app.route('/display_data', methods=['GET', 'POST'])
def display_data():
data = [['item1', ['subitem1', 'subitem2', 'subitem3']], ['item2', ['subitem1', 'subitem2', 'subitem3']], ['item3', ['subitem1', 'subitem2']], ['item4', ['subitem1']]]
#replace data with database query
item_value = namedtuple('item_value', ['item_id', 'value'])
return flask.render_template('data_display.html', items = [item_value(i, a) for i, [a, _] in enumerate(data, 1)])
@app.route('/get_subitems')
def get_subitems():
target_id = int(flask.request.args.get('item_id'))-1
data = [['item1', ['subitem1', 'subitem2', 'subitem3']], ['item2', ['subitem1', 'subitem2', 'subitem3']], ['item3', ['subitem1', 'subitem2']], ['item4', ['subitem1']]]
#can replace data with database query
result = [b for i, [a, b] in enumerate(data) if i == target_id][0]
return flask.jsonify({'target_id':str(target_id+1), 'html':'<ul>\n{}\n</ul>'.format('\n'.join(f'<li>{i}</li>' for i in result))})