'JavaScript fetch likes not showing up in the social Post in Django
I am making social website in Django. I made a backend which works properly. The problem is with JavaScript (with which I'm less familiar than python, so sorry about that). When page is loaded, I fetch API which tells me if post is liked or not. Than I should add the corresponding picture (red or gray heart). Hearts are not showing up at all at page load. Note: back end code works as intended. I can visit fetch link and data is correct. The code:
js file
document.addEventListener('DOMContentLoaded', function() {
var allButtons = document.querySelector('#all').childElementCount;
console.log(allButtons)
var content = document.querySelectorAll('.name');
var button = document.querySelectorAll('#heart');
var edit = document.querySelectorAll('#edit');
var subedit = document.querySelectorAll('#subedit');
var editdiv = document.querySelectorAll('.editdiv');
var post = document.querySelectorAll('.post');
var textarea = document.querySelectorAll('.textarea');
var editbutton=document.querySelectorAll('input[name="edit"]')
var csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
var likenum = document.querySelectorAll('#likenum')
var page=document.querySelector("#page").innerHTML
for (i = 0; i < allButtons; i++) {
function listen(i) {
var heart = new Image();
heart.id = "main";
var requestPOST = new Request(
`/Post/${content[i].id}`,
{
method: 'POST',
headers: {'X-CSRFToken': csrftoken},
mode: 'same-origin'
}
);
var requestGET = new Request(
`/Post/${content[i].id}`,
{
method: 'GET',
}
);
edit[i].addEventListener('click', () => {
editdiv[i].style.display = 'block';
editbutton[i].className="btn btn-info"
post[i].style.display = 'none';
subedit[i].addEventListener('click', () => {
fetch(`/edit/${content[i].id}`,
{
method: 'POST',
headers: {'X-CSRFToken': csrftoken},
mode: 'same-origin',
body: JSON.stringify({
post: textarea[i].value,
page: page
})}).then(() => {
editdiv[i].style.display = 'none';
post[i].style.display = 'block';
})})})
fetch(requestGET).then((response) => response.json()).then((data) => {
if (data[0]=="like") {
heart.src = "/static/network/like.png"
}
else {
heart.src = "/static/network/nolike.png"
}
likenum[i].innerHTML=data[1]
button[i].appendChild(heart);
})
button[i].addEventListener('click', () =>
fetch(requestPOST).then((response) => response.json()).then((data) => {
if (data[0]=="like") {
heart.src = "/static/network/like.png"
}
else {
heart.src = "/static/network/nolike.png"
}
likenum[i].innerHTML=data[1]
button[i].appendChild(heart);
heart.style.animationPlayState = 'running';
}
))}listen(i)}})
index.html
{% extends "network/layout.html" %}
{% block body %}
<div style="text-align:center">
<form method="POST">{% csrf_token %}
{{ newpost }}
<div><input type="submit" id="submit" value="Post" class="btn btn-primary"></div>
</form>
</div>
<br>
{% include "network/posts.html" %}
{% endblock %}
posts.html base template:
{% if user.is_authenticated %}
<div id = "all">
{% for post in posts %}
<div>
{% if post.user != request.user %}
<input type="hidden" name="edit" id ="edit"></input>
{% else %}
<input type="button" class="btn btn-secondary" value="edit" name="edit" id ="edit"></input>
{% endif %}
<div class="post">
<a class="username" id="{{ post.user.id }}" href="{% url 'other_profile' post.user.id %}">{{ post.user.username }}</a>
<div class="name" id = "{{ post.id }}"><div>{{ post.date }}</div><div style="font-size: 25px;">{{ post.post }}</div></div>
<div id ="heart"><span id="likenum"></span></div>
</div>
<div class = "editdiv">
<form method = "POST">{% csrf_token %}
<textarea name="content" class="textarea" placeholder="edit">{{ post.post }}</textarea>
<div><button class="btn btn-primary" id="subedit">Edit</button></div>
</form>
</div>
<br>
{% endfor %}
</div>
</div>
{% endif %}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
