Django ajax функция upvote downvote

Я очень новичок в ajax, мне нужна помощь в реализации ajax в функции django upvote-downvote utils. Я пытался сделать это самостоятельно, но не смог, любая помощь будет очень признательна, спасибо.

Вот фрагменты кода:

в моей модели: models.py

class Questions(models.Model):
    title = models.CharField(max_length=long_len)
    ques_content = models.TextField()
    tags = models.ManyToManyField(Tags)
    upvotes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='user_upvote')
    downvotes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='user_downvote')
    answers = models.ManyToManyField('main.Answer', related_name='answers')
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=False)
    views = models.IntegerField(default=0)
    is_answered = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    votes = models.IntegerField(default=0)
    has_accepted_answer = models.BooleanField(default=False)

в моих утилитах: utils.py

def performUpDownVote(user,isQuestion,id,action_type):
    id = int(id)
    flag = False
    if isQuestion == 'True':
        print('------> isQ')
        q = Questions.objects.get(pk = id)
        if q.author == user:
            return False
    else:
        print('------> isNotQ')
        flag=True
        q = Answer.objects.get(pk = id)
        if q.answered_by == user:
            return False

    existsInUpvote = True if user in q.upvotes.all() else False
    existsDownUpvote = True if user in q.downvotes.all() else False
    if existsInUpvote:
        if action_type == 'downvote':
            q.upvotes.remove(user)
            q.downvotes.add(user)
            reputation(flag,-20, q)
            q.votes = q.votes - 1
    elif existsDownUpvote:
        if action_type == 'upvote':
            q.downvotes.remove(user)
            q.upvotes.add(user)
            reputation(flag,20, q)
            q.votes = q.votes + 1
    else:
        if action_type == 'downvote':
            q.downvotes.add(user)
            reputation(flag,-10, q)
            q.votes = q.votes - 1
        if action_type == 'upvote':
            q.upvotes.add(user)
            reputation(flag,10, q)
            q.votes = q.votes + 1
    q.save()
    return True

в моих представлениях: views.py

def questions(request):
    main_query = Questions.objects
    if request.GET and ('q' in request.GET) and request.GET['q'] == 'mostviewed':
        all_questions = main_query.all().order_by('-views')
        marked = 'mostviewed'
    elif request.GET and ('q' in request.GET) and request.GET['q'] == 'unanswered':
        all_questions = main_query.filter(
            is_answered=False).order_by('-created_at')
        marked = 'unanswered'
    else:
        marked = 'latest'
        all_questions = main_query.all().order_by('-created_at')

    total_questions = Questions.objects.count()
    seeuser = StackoverflowUser

    user = request.user

    try:
        if request.GET and request.GET['isQuestion'] and request.GET['id'] and request.GET['action_type']:
            result = performUpDownVote(
                user, request.GET['isQuestion'], request.GET['id'], request.GET['action_type'])
            redirect_to = '/question/'+str(pk)
            if 'page' in request.GET:
                redirect_to += '?page='+request.GET['page']
            return redirect(redirect_to)
    except Exception:
        pass

        messages.success(request, 'Question posted successfully')

        return redirect('name_questionsingle', pk=q.pk)

в urls: urls.py

urlpatterns = [
    path('', views.questions, name = 'name_questions'),
    path('tag/<str:tag_word>/', views.questionByTag, name = 'name_questionByTag'),
    path('tag/<str:tag_word>/', views.postByTag, name = 'name_postByTag'),
    path('question/<int:pk>/', views.questionsingle, name = 'name_questionsingle'),
    path('post/<int:pk>/', views.postdetail, name = 'name_postdetail'),
    path('askquestion/', views.askquestion, name = 'name_askquestion'),
    path('createpost/', views.createpost, name = 'name_createpost'),
    path('posts/', views.posts, name = 'name_posts'),
    path('profile/<str:username>/', views.profile, name = 'name_profile'),
    path('question/<int:pk>/<int:pk2>/', views.is_accepted, name = 'name_is_accepted'),
    path('post_deleted/<int:id>', views.delete_post, name = 'post_deleted'),
    path('question_deleted/<int:id>', views.delete_quest, name = 'question_deleted'),
    path('comment_deleted/<int:id>', views.delete_comment, name = 'comment_deleted'),

]

html

<div class="p-1 px-4 upvote" style="margin: -10px 10px 0px 10px;">
            {% if user.is_authenticated %}
            <a href="?isQuestion=True&id={{q.pk}}&action_type=upvote&page={{all_answers.number}}" style="font-weight: 400;" class="upvoteaction">
              <i id="upvote" class="bi bi-triangle-fill" style="font-size: 18px;" data-toggle="tooltip" title="Upvote"></i> 
            </a>
            {% else %}
            <a href="{% url 'name_questionsingle' q.pk %}" style="font-weight: 400;" data-toggle="tooltip" title="Upvote">
              <i class="bi bi-triangle-fill" style="font-size: 18px;"></i>
            </a>
            {% endif %}
          </div>
          <div class="p-1 px-4 downvote" style="margin: -10px 10px 0px 10px;">
            {% if user.is_authenticated %}
            <style>i#di.bi-triangle-fill::before {transform: rotate(180deg);}</style>
            <a href="?isQuestion=True&id={{q.pk}}&action_type=downvote&page={{all_answers.number}}"
              style="font-weight: 400" data-toggle="tooltip" title="Downvote"><i id="di" class="bi bi-triangle-fill" style="font-size: 18px"></i> </a>
            {% else %}
            <a href="{% url 'name_questionsingle' q.pk %}" style="font-weight: 400" data-toggle="tooltip" title="Downvote"><i class="bi bi-triangle-fill"
                style="font-size: 18px"></i> </a>
            {% endif %}
          </div>
Вернуться на верх