Как передать параметры сортировки из чексбоксов на сервер Django Ajax

Имеется форма с 3мя chackbox (к примеру). Необходимо чтобы при нажатии на любой (или несколько) из них происходила фильтраци данных на сервере Django. Например, нажимаем 'Волгоград' и 'Урюпинск' выводятся художники из этих городов. Код перестает работать при добавлении метода ajax. Пулучается, по-моему тут 2 проблемы: работа метода Ajax и передача параметров на сервер Django.

Буду благодарна за любые дельные советы)

html (фрагмент)

<form class="myform">
   <input type="checkbox" name="city" value="Волгоград">Волгоград
   <input type="checkbox" name="city" value="Жирновск">Жирновск
   <input type="checkbox" name="city" value="Урюпинск">Урюпинск
</form>

JS (фрагмент)

var checkboxes = document.querySelectorAll("input[type=checkbox][name=city]");
let res = [];

checkboxes.forEach(function(checkbox) {
  checkbox.addEventListener('change', function(e) {
    e.preventDefault();
    res = Array.from(checkboxes).filter(i => i.checked).map(i => i.value);
    json_res = JSON.stringify(res);
    console.log(json_res);

    var csrftoken = $("[name=csrfmiddlewaretoken]").val();

     $.ajax(
    {
        type:"POST",
        url: "{% url 'AptPersons' %}",
        headers:{
        "X-CSRFToken": csrftoken
        },
        cache: true,
        data: json_res,
        dataType : "json",
        success: function(response){
                showHtml(response);
        },
        error: function(response){
            $("#alert").text('Не работает');
        },
     })

  })
});

views.py (фрагмент)

@csrf_protect
def Apt_PerView(request):

    artPerson = sorted(ArtPerson.objects.all().order_by('name'), key=lambda x: random.random())

    if request.method == 'POST':
        if request.POST['action'] == 'sort_up':
            artPerson = ArtPerson.objects.order_by('-name').values() #РАБОТАЕТ
        elif request.POST['action'] == 'sort_down':
            artPerson = ArtPerson.objects.order_by('name').values() #РАБОТАЕТ
        elif request.POST.getlist('arr[]') == ['Волгоград', 'Жирновск']:
            artPerson = ArtPerson.objects.filter(city="Волгоград").values() | ArtPerson.objects.filter(city="Жирновск").values() #НЕ РАБОТАЕТ
        elif request.POST.getlist['arr[]'] == ['Урюпинск']:
            artPerson = ArtPerson.objects.filter(city="Урюпинск").values() #НЕ РАБОТАЕТ
        # И так далее, всего 8 вариантов
        names = []
        cities = []
        slugs = []
        statuses = []
        image_artpersons=[]
        for d in artPerson:
            names.append(d['name'])
            cities.append(d['city'])
            slugs.append(d['slug_ap'])
            statuses.append(d['status'])
            image_artpersons.append(d['image_artperson'])
        json_data = {
            "names": names,
            "cities": cities,
            "slugs": slugs,
            "statuses": statuses,
            "image_artpersons": image_artpersons
        }
        return JsonResponse(json_data)
    else:
        return render(request, 'NewApp/Apt_Per.html', {'map_ArtPerson': artPerson})

Первое, что вам нужно знать, это то, что при использовании ajax вы не должно использовать формы. Обычно на форму вешается button type='submit', при нажатии на который страница будет обновлена. Использование ajax позволяет делать асинхронные http get/post запросы га сервер не перезагружая страницу.

Сначала вам нужно каждому input дать уникальный аттрибут id, для вашего кода будет примерно вот так:

<form class="myform">
   <input type="checkbox" id="id-volg" name="city" value="Волгоград">Волгоград
   <input type="checkbox" id="id-jirn" name="city" value="Жирновск">Жирновск
   <input type="checkbox" id="id-uup" name="city" value="Урюпинск">Урюпинск
</form>

Далее используем стандартную схему ajax запроса:

$.ajax({
    url: '/your/url/point',
    method: 'post',
    data: JSON.stringify({
        field1: $('#id-volg').is(':checked'),
        field2: $('#id-jirn').is(':checked'),
        field3: $('#id-uup').is(':checked'),
    }),
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    success: (response) => {
        // Do smth if success response (200, 201 e.t.c) 
    },
    error: (response) => {
        // Do smth if error response (400, 401, 403, 404, 50X e.t.c)
    }
})

Подставьте просто адрес ендпоинта и всё

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