Здравствуйте. Я пытаюсь заполнить таблицу с помощью Flask и Data Tables - и сделать это fast .Рендеринг всей HTML-таблицы слишком медленный, поэтому я попытался (и преуспел), используя ajax: url-to-file
и deferRender: True
.Однако я хочу сделать это, просто передав данные и используя JavaScript или Ajax, каким-то другим способом - без файла.
Я пробовал различные способы заполнения таблицы, например , передаваяURL другого маршрута , но безрезультатно.
Единственный способ найти данные в шаблоне, как я нашел, - это следующий способ.К сожалению, мне не удается выполнить последнюю задачу по заполнению таблицы.
Маршрут в views.py
:
@main.route('/table_display_route')
def table_display():
# ...
# creating df from session items
# ...
columns = df.columns # for a dynamically created table
table_json = json.dumps(json.loads(df.to_json(orient='index')))
return render_template('display.html', columns=columns,
table_json=table_json)
table_json имеет следующую форму:
"1": {"col1": "atr1", "col2": "atr2", ...}, "2": {... etc ...
Затем display.html
, отображая только заголовки таблицы:
..
<thead>
<tr>
{% for column in columns %}
<th>{{ column }}</th>
{% endfor %}
</tr>
</thead>
...
И скрипт, который пытается заполнить строки следующим образом, не работает:
$('#display_table').find('table').DataTable( {
data: {{ table_json }},
// ...
} );
Есть предложения?
РЕШЕНИЕ (согласно выбранному ответу с небольшими изменениями):
views.py:
@main.route('/table_display_route')
def table_display():
// .. building df from session
# get table headers and rows
columns = df.columns
rows = df.to_json(orient='values')
return render_template('display.html', columns=columns, rows=rows,...)
display.html:
...
<div id="display_table">
<table class="cell-border" >
<thead>
<tr>
{% for column in columns %}
<th>{{ column }}</th>
{% endfor %}
</tr>
</thead>
</table>
</div>
...
Сценарий:
// set table as DataTable
var display_table = $('#display_table').find('table').DataTable({
...
deferRender: true
});
function loadTable() {
$.get('table_display_route', function(response, status){
var data = {{ rows }};
display_table.clear();
Object.keys(data).forEach(function(key) {
// fill row
row = data[key]
// append to table
display_table.row.add(row);
});
// Update table -- make rows visible.
display_table.draw();
});
}
//execute function
loadTable();