Django + Ajax: почему происходит перенаправление на новый URL и отображение ответа в браузере?

Исходя из моего понимания, ajax можно использовать для предотвращения перезагрузки/обновления/перенаправления страницы после отправки запроса на сервер. Однако мой код перенаправляет страницу для отображения JSON-ответа. Я использовал e.preventDefault(), но это не сработало. Есть ли что-то, что я делаю неправильно?

Мой код Django выглядит следующим образом: views.py:

def projects(request):
    if request.method == 'POST':
        task_id = request.POST.get('task_id')
        myUser = User.objects.get(pk=request.user.id)
        myTask = Task.objects.get(pk = task_id)
        myTask.claimed.add(myUser) #add the user to the task
        return JsonResponse({'status': 'ok'})

    projects = Project.objects.all()
    tasks = Task.objects.all()
    open_tasks = tasks.filter(status='Created')
    proj_dict = {}
    context = {
        'projects' : projects,
        'tasks' : tasks,
        'open_tasks' : open_tasks,
    }
    return render(request, 'projects/projects.html', context)

Мой HTML:

<form action="{% url 'projects:' %}" method="POST" class='join-form' id='{{task.id}}'>
    {% csrf_token %}
    <input type="hidden" name="task_id" value={{task.id}}>
    <button type="submit" class=" claim-font claim-button">
        Join
    </button>
</form>

Вызов ajax:

<script>
    $(document).ready(function () {
        $('#join-form').on('submit', function (e) {
            e.preventDefault();
            e.stopPropagation();
            const url = $(this).attr('action');
            console.log("here we are");
            const task_id = $(this).attr('id');
            $.ajax({
                type: 'POST',
                dataType: "json",
                headers: { 'X-CSRFToken': csrftoken },
                url: url,
                data: {
                    csrfmiddlewaretoken: '{{ csrf_token }}',
                    task_id: task_id,
                },
                success: function (response) {
                    alert(data);
                    console.log("here we are");
                },
                error: function (response) {
                    console.log('error', response);
                    alert("shit")
                }
            })
            return false;
        });
    });
</script>

Казалось бы, ajax сделает так, что мой браузер не будет перенаправлять/перезагружать/обновлять после нажатия кнопки submit, а изменения будут происходить только на стороне сервера. Однако мой браузер отображает: {"status": "ok"}

Любые идеи будут высоко оценены!

Я заметил, что у вас есть атрибут class для вашей формы. Измените селектор JQuery с $('#join-form') на $('.join-form') для атрибутов класса

<script>
    $(document).ready(function () {
        $('.join-form').submit(function(e) {
            e.preventDefault();
          // write your code here
         });
        
    });
</script>

Вам необходимо изменить тип кнопки с "submit" на "button"

Вернуться на верх