#javascript #html #flask #jinja2
Вопрос:
<table>
<tr>
<th>ID</th>
<th>Type</th>
<th>Name</th>
<th>Start Date</th>
<th>Target Date</th>
<th>Estimate</th>
<th>Status</th>
<th>Actual Hours</th>
<th>Approved Hours</th>
<th>Start Date</th>
<th>Target Date</th>
</tr>
{% for val in details %}
<tr>
<td><button id={{loop.index}} onclick=myFunction(this)>{{loop.index}}</button>{{val['id']}}</td>
<td>{{val['type']}}</td>
<td>{{val['name']}}</td>
<td>{{val['start_date']}}</td>
<td>{{val['target_date']}}</td>
<td>{{val['estimate']}}</td>
<td>{{val['status']}}</td>
<td>{{val['timesheet_details']['actual_hours']}}</td>
<td>{{val['timesheet_details']['approved_hours']}}</td>
<td>{{val['timesheet_details']['actual_start_date']}}</td>
<td>{{val['timesheet_details']['actual_target_date']}}</td>
</tr>
{% endfor %}
</table>
<script>
function myFunction(z){
var currTR = z.parentNode.parentNode;
var newTR = document.createElement("tr");
newTR.innerHTML = "<td>s</td><td>Col 2</td><td>Col 3</td>";
currTR.parentNode.insertBefore(newTR, currTR.nextSibling);
}
function some(x){
}
</script>
цель состоит в том, чтобы каждый раз, когда я нажимаю кнопку, она должна отправлять в мою функцию некоторые данные для новой строки, которую она собирается добавить, и значения этой функции будут td, которые должна добавить новая строка.
onclick=myFunction(this,{{val}})
...
<script>
function myFunction(z,l)
...
newTR.innerHTML = "<td>l[2]</td><td>l[3]</td><td>l[4]</td>";
</script>
Но я не могу отправить переменную jinja в javascript, и, когда я пишу это, я понимаю, что тоже не знаю, как получить доступ к данным в javascript. любая помощь будет признательна.
Комментарии:
1. В Javascript нет ничего волшебного, это просто часть вашего шаблона. Ваша проблема в том, что вы неправильно используете кавычки, т. е. пытаетесь
var l = '{{ val }}';
2. Это сработало, но я понял, что val-это переменная, созданная в цикле for, поэтому она завершается по щелчку
Ответ №1:
Вы не можете напрямую передать переменную jinja в javascript, вы должны ввести ее в свой html следующим образом: <button id={{jinja_var}} onclick=myFunction({{jinja_var}})>
ваш код должен выглядеть примерно так:
<table>
<tr>
<th>ID</th>
<th>Type</th>
<th>Name</th>
<th>Start Date</th>
<th>Target Date</th>
<th>Estimate</th>
<th>Status</th>
<th>Actual Hours</th>
<th>Approved Hours</th>
<th>Start Date</th>
<th>Target Date</th>
</tr>
{% for val in details %}
<tr>
<td><button id={{loop.index}} onclick=myFunction({{loop.index}})>{{loop.index}}</button>{{val['id']}}</td>
<td>{{val['type']}}</td>
<td>{{val['name']}}</td>
<td>{{val['start_date']}}</td>
<td>{{val['target_date']}}</td>
<td>{{val['estimate']}}</td>
<td>{{val['status']}}</td>
<td>{{val['timesheet_details']['actual_hours']}}</td>
<td>{{val['timesheet_details']['approved_hours']}}</td>
<td>{{val['timesheet_details']['actual_start_date']}}</td>
<td>{{val['timesheet_details']['actual_target_date']}}</td>
</tr>
{% endfor %}
</table>
<script>
function myFunction(z){
var currTR = z.parentNode.parentNode;
var newTR = document.createElement("tr");
newTR.innerHTML = "<td>s</td><td>Col 2</td><td>Col 3</td>";
currTR.parentNode.insertBefore(newTR, currTR.nextSibling);
}
function some(x){
}
</script>
в примере я использовал переменную {{loop.index}}
, но если вам нужно использовать значение, содержащееся в объекте val
, просто замените {{loop.index}}
на {{val['my_value']}}
:
<button id={{loop.index}} onclick=myFunction({{val['my_value']}})>{{loop.index}}</button>