Получить список элементов, которые были переданы из файла python (Django) в html, из html в Javascript, который находится на той же странице
мой код на питоне:
def index(request):
body=list(Body.objects.all())
loads=list(Load.objects.all().order_by('length'))
badLoads=[]
goodLoads=[]
for load in loads:
if load.length>body[0].length or load.width>body[0].width or load.mass>body[0].mass:
badLoads.append(load)
else:
goodLoads.append(load)
goodLoadsLength=len(goodLoads)
context={
'body':body[0],
'loads':loads,
'badLoads':badLoads,
'goodLoads':goodLoads,
'goodLoadsLength':goodLoadsLength,
}
return render(request,'index.html',context)
html код:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Positioning of objects</title>
</head>
<body>
<div>
{% if body %}
<p>body length: {{ body.length }}, body width: {{ body.width }}, body height: {{ body.height }}, body max mass, which can be taken: {{ body.mass }}</p>
{% else %}
<p>No parameters found</p>
{% endif %}
</div>
<div>
{% if loads %}
<ul>
{% for load in loads %}
<li>load id: {{ load.id }}, load length:{{ load.length }}, load width: {{load.width}}, load height: {{load.height}}, load mass: {{load.mass}}</li>
{% endfor %}
</ul>
{% else %}
<p>No loads are available.</p>
{% endif %}
</div>
<div>
{% if goodLoads %}
<ul>
{% for goodLoad in goodLoads %}
<li>load id: {{ goodLoad.id }}, load length:{{ goodLoad.length }}, load width: {{goodLoad.width}}, load height: {{goodLoad.height}}, load mass: {{goodLoad.mass}}</li>
{% endfor %}
</ul>
{% else %}
<p>No loads are available.</p>
{% endif %}
</div>
<div>
{% if loads %}
<ul>
{% for badLoad in badLoads %}
<li>load id: {{ badLoad.id }}, load length:{{ badLoad.length }}, load width: {{badLoad.width}}, load height: {{badLoad.height}}, load mass: {{badLoad.mass}}</li>
{% endfor %}
</ul>
{% else %}
<p>No loads are available.</p>
{% endif %}
</div>
<script>
const loadsLength="{{goodLoadsLength}}";
const goodLoads="{{goodLoads}}"
</script>
</body>
</html>
Я хотел бы сделать простую таблицу с помощью javascript на той же странице. Я знаю, что могу сделать таблицу через html, но я хотел бы сделать это через Javascript, на той же странице. Но почему-то я вижу в скрипте простые переменные, как вот эта:
const loadsLength="{{goodLoadsLength}}";
Но я не могу сделать список элементов. Количество элементов может быть разным. Поэтому он должен проходить через цикл for или forEach, но скрипт не дает мне никакой возможности получить члены списка в случае python (или массива в случае javascript) в блок javascript. Если я попытаюсь:
const goodLoads="{{goodLoads}}";
console.log(goodLoads);
Это дает мне:
[<Load: Load object (1)>]
Похоже, что он видит объект в массиве. Но когда я пытаюсь:
console.log(goodLoads[0].length);
или
foodLoads.forEach(item=>{
console.log(item.length)
})
Выдает: объект не определен. Я попробовал еще пару подходов, например, цикл for с for object in objects, или обычный цикл for с step++. Но объект не определен
Наверное, я не понимаю, как получить список/массив из html в блок скрипта. Он должен быть виден как обычный массив элементов. Но я не могу их получить. Может кто-нибудь подсказать мне ответ? Спасибо.
Используйте встроенный в Django json_script
(см. документацию здесь) тег шаблона для безопасного вывода объекта python в виде JSON, обернутого в тег скрипта. Затем в вашем основном JS-скрипте вы можете разобрать JSON-объект и выполнить с ним все стандартные операции.
В вашем шаблоне:
{{ goodLoads|json_script:"goodLoads"}}
В вашем главном JS-файле:
let goodLoads = JSON.parse(document.getElementById('goodLoads').textContent);
Другая проблема заключается в том, что вы передаете объекты QuerySet в контекстную переменную goodLoads. Эти объекты не очень полезно иметь в вашем JS-файле, потому что вы не можете получить доступ к значениям полей объекта. Для этого превратите объект QuerySet в dict, прежде чем передавать его в контекст.
Например, используя queryset.values(),
def index(request):
body=list(Body.objects.all())
loads=list(Load.objects.all().order_by('length'))
badLoads=[]
goodLoads=[]
for load in loads:
if load.length>body[0].length or load.width>body[0].width or load.mass>body[0].mass:
badLoads.append(load.values()) #converting to dict here
else:
goodLoads.append(load.values()) #converting to dict here
goodLoadsLength=len(goodLoads)
context={
'body':body[0],
'loads':loads,
'badLoads':badLoads,
'goodLoads':goodLoads,
'goodLoadsLength':goodLoadsLength,
}
return render(request,'index.html',context)