I have a list in Django views, and I want to pass it to JavaScript for iteration, I’ve tried serveral way but seems like the data can’t be used by the JavaScript, could anyone have a look, please?
JavaScript
x
2
1
views.py
2
”’
JavaScript
1
16
16
1
def visualisation(request, project_id):
2
3
project = Project.objects.get(id=project_id)
4
5
todos = project.todo_set.filter(status='to_do')
6
progresses = project.todo_set.filter(status='in_progress')
7
dones = project.todo_set.filter(status='done')
8
9
counts_data = Todo.objects.aggregate(
10
to_do_count = Count('pk', filter=Q(status='to_do')),
11
in_progress_count = Count('pk', filter=Q(status='in_progress')),
12
done_count = Count('pk', filter=Q(status='done'))
13
)
14
15
return render(request, 'todo_lists/progress.html', counts_data)
16
”’
JavaScript
1
2
1
html
2
”’
JavaScript
1
22
22
1
data: {
2
labels: ['todo','inprogress','done'],
3
4
datasets: [{
5
label: '# of Votes',
6
7
data: [{% for todo in data %} {{ todo }}, {% endfor %}],
8
9
backgroundColor: [
10
'rgba(255, 99, 132, 0.2)',
11
'rgba(54, 162, 235, 0.2)',
12
'rgba(255, 206, 86, 0.2)'
13
],
14
borderColor: [
15
'rgba(255, 99, 132, 1)',
16
'rgba(54, 162, 235, 1)',
17
'rgba(255, 206, 86, 1)'
18
],
19
borderWidth: 1
20
}]
21
}
22
”’
Advertisement
Answer
JavaScript
1
19
19
1
import json
2
3
def visualisation(request, project_id):
4
5
project = Project.objects.get(id=project_id)
6
7
todos = project.todo_set.filter(status='to_do')
8
progresses = project.todo_set.filter(status='in_progress')
9
dones = project.todo_set.filter(status='done')
10
11
counts_data = Todo.objects.aggregate(
12
to_do_count = Count('pk', filter=Q(status='to_do')),
13
in_progress_count = Count('pk', filter=Q(status='in_progress')),
14
done_count = Count('pk', filter=Q(status='done'))
15
)
16
counts_data_json = json.dumps(counts_data)
17
18
return render(request, 'todo_lists/progress.html', {"counts_data":counts_data_json})
19
template
JavaScript
1
27
27
1
<script>
2
var counts_data = JSON.parse(`{{ counts_data | escapejs }}`);
3
</script>
4
<script>
5
var your_datadata = {
6
labels: ['todo','inprogress','done'],
7
8
datasets: [{
9
label: '# of Votes',
10
11
data: counts_data,# you don't need to use the template tag anymore
12
13
backgroundColor: [
14
'rgba(255, 99, 132, 0.2)',
15
'rgba(54, 162, 235, 0.2)',
16
'rgba(255, 206, 86, 0.2)'
17
],
18
borderColor: [
19
'rgba(255, 99, 132, 1)',
20
'rgba(54, 162, 235, 1)',
21
'rgba(255, 206, 86, 1)'
22
],
23
borderWidth: 1
24
}]
25
}
26
</script>
27