Javascript Django like button doesn't update counter

I have created Put request to update like count, but when I press like button count doesn't change unless I refresh page. and like/unlike function works fine. Can somebody help me resolve this issue?

view.py Here is how i have done put request.

class PostLikeView(APIView):
    
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticated]

    def get(self, request, post_id, slug=None, format=None):
        post = Post.objects.get(pk=post_id)
        serializer = PostSerializer(post, many=False, )
        return JsonResponse(serializer.data, safe=False)

    def put(self, request, post_id, slug=None, format=None):
        post = Post.objects.get(pk=post_id)
        user = self.request.user
        # if user.is_authenticated():
        if user in post.likes.all():
                post.likes.remove(user.id)
        else:
            post.likes.add(user.id)
        serializer = PostSerializer(post, data=request.data)
        if serializer.is_valid():
            serializer.save()
        return JsonResponse(serializer.data, safe=False)

In javascript at like_button.addEventListener i calling function like post where i pass post_id this function works except counter doesnt change unless i refresh page, can I edit so counter update without refreshing if not how to setup automatically to refresh after put request complete? index.js

function post_list(post) {
    const postdiv = document.createElement('div')
    postdiv.setAttribute('id','post-div')

    const userdiv = document.createElement('div')
    userdiv.setAttribute('id', 'username-div')

    const bodydiv = document.createElement('div')
    bodydiv.setAttribute('id', 'body-div')


    const datediv = document.createElement('div')
    datediv.setAttribute('id', 'date-div')



    const datep = document.createElement('p')
    datep.setAttribute('id', 'date-paragraph')

    const userp = document.createElement('p')
    userp.setAttribute('id', 'username-paragraph')

    const bodyp = document.createElement('p')
    bodyp.setAttribute('id', 'body-paragraph')
    
    // LIKE 
    const likesdiv = document.createElement('div')
    likesdiv.setAttribute('id', 'likes-div')

    let likesp = document.createElement('p')
    likesp.setAttribute('id', 'likes-paragraph')

    // LIKE BUTTON
    let like_button = document.createElement('button')
    like_button.setAttribute('id', 'like-button')
    
    const post_id = post.id
    let user_id = document.querySelector("#user-id").value;
    let likes = post.likes

    const postp = document.createElement('p')
    postp.innerHTML = post_id

    //  LIKE COUNTER
    let likes_counter = post.likes.length
    console.log(likes_counter)
    likesp.innerHTML = `Likes: ${likes_counter}`

    
    if (likes.indexOf(parseInt(user_id)) >= 0) {
        like_button.innerHTML = 'Unlike'
    } else {
        like_button.innerHTML = 'Like'  
    }
    
    like_button.setAttribute('type', 'submit')
   
    like_button.addEventListener('click', () => {
        if(like_button.innerText.toLowerCase() === 'like') {
            like_button.innerText = 'Unlike';
            
          }
          else {
            like_button.innerText = 'Like';
            
          }
        like_post(post_id, post.likes);
        
    })
    
    
    datep.innerHTML = post.date
    datediv.append(datep)

    userp.innerHTML = post.user
    userdiv.append(userp)

    bodyp.innerHTML = post.post
    bodydiv.append(bodyp)
    
    likesdiv.append(likesp, like_button)

    postdiv.append(bodydiv, userdiv, likesdiv, datediv, )
    document.querySelector('#post-list').append(postdiv)
}

function like_post(post_id) {
    
    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    
    const csrftoken = getCookie('csrftoken');
    let user = document.querySelector('#user-id').value;
    fetch(`/posts/${post_id}`, {
        method: 'PUT',
        headers: {
            "X-CSRFToken":  csrftoken ,
            'Accept': 'application/json',
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            user: user,
            id: post_id,
        })
    })
    .then(response => response.json())
    .then(result => {
        // Print result
        console.log(result);     
    })
}

I've managed to solve my problem. If anyone gets in similar situation to know. This probable is not the most elegant way to solve this but it works

 //  LIKE COUNTER
    let likes_counter = post.likes.length
    likesp.innerHTML = `Likes: ${likes_counter}`


    if (document.querySelector("#user-id") != null) {
        
        let user_id = document.querySelector("#user-id").value;
        // LIKE BUTTON
        let like_button = document.createElement('button')
        like_button.setAttribute('id', 'like-button')

        if (post.likes.indexOf(parseInt(user_id)) >= 0) {
            like_button.innerHTML = 'Unlike'
        } else {
            like_button.innerHTML = 'Like'  
        }
        
        like_button.setAttribute('type', 'submit')
       
        like_button.addEventListener('click', () => {
            
            if(like_button.innerText.toLowerCase() === 'like') {
                like_button.innerText = 'Unlike';
                likes_counter ++    
              }
              else {
                like_button.innerText = 'Like';
                likes_counter -- 
              }
              likesp.innerHTML = `Likes: ${likes_counter}`
            like_post(post_id, post.likes);  
        })
        likesdiv.append(like_button)
    } 
Back to Top