Невозможно получить данные формы POST или GET при использовании AJAX - PullRequest
0 голосов
/ 10 июня 2019

Пытались отфильтровать данные, используя django-фильтры. Код работает, когда я отправляю отдельный запрос POST или GET из шаблона. Я хочу избежать той дополнительной перезагрузки, которая имеет место для фильтрации информационной таблицы.

Вот вид:

def search(request):

    dynamic_filter = [f.name for f in Controlpanel._meta.get_fields()]

    class UserFilter(django_filters.FilterSet):
        class Meta:
            model = Controlpanel
            fields = dynamic_filter

    user_list = Controlpanel.objects.all()
    user_filter = UserFilter(request.GET.get("filters[]"), 
    queryset=user_list)
    chart = list(user_filter.qs.values())

    return JsonResponse(chart, safe=False)

Вот код AJAX, который вызывает это представление выше:

$('#filter-data').on('submit', function (event) {
    event.preventDefault();
    var dynamic = $('#filter-data').serialize();
    console.log($('#filter-data').serializeArray())
    $.ajax({
      url: '/search/',
      type: 'GET',
      data: {
        filters : dynamic
      },
      dataType: 'json',
   success : function(json) {
        console.log(json); // log the returned json to the console
        console.log("success"); // another sanity check
    },

    // handle a non-successful response
    error : function(xhr,errmsg,err) {
        console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console
    }
    });

request.GET (или POST) в настоящее время остается пустым, даже если я добавлю токен CSRF и сделаю его запросом POST.

Я столкнулся с вопросом о том, что использование request.body решает проблему, но даже это было неудачей.

1 Ответ

0 голосов
/ 15 июня 2019

Проблема заключалась в том, что запрос POST передавался в виде строки.

Это решило проблему:

user_filters = request.POST.get('filters', '')
user_filters = user_filters.split("&")

user_filters = {item.split("=")[0]: item.split("=")[1].replace("%20", " ")
                for item in user_filters}

user_filters.pop('csrfmiddlewaretoken')
...