Не удалось получить AJAX значение запроса данных в Django функции просмотра - PullRequest
0 голосов
/ 04 мая 2020

У меня есть AJAX запрос на получение некоторых данных из пост-модели "Я использую Django3 и python 3.8". Когда я печатаю request.GET.get в консоль, я получаю «None». Там не было никаких данных. Однако, когда я предупреждаю о переданных данных в javascript, я получаю правильное значение. Я не мог понять, какая часть моего кода должна быть немного подправлена ​​для работы.

Вот вызов AJAX:

   <script type="text/javascript">
   // to submit the get request and prevent the default submission
  $(document).on('click', '#post-det', function(e) {
    e.preventDefault();


    var post_id = $(this).children(':first-child').text();
    var post_id = parseInt(post_id);
    alert(post_id);

    $.ajax({
        'type':'GET',
        'url': "{% url 'get_post_details' %}",
        'data':post_id,
        'processData': false,
        'cache':false,
        'contentType': false,
        'dataType': 'json',
        csrfmiddlewaretoken:'{{ csrf_token }}',

        success: function(data) {

          alert(data)
        },

    });
    });  
   </script>

Я получил "2" для post_ID

Однако я не смог получить его в Django функции просмотра , Вот функция просмотра:

def post_details(request):
if request.method == 'GET' and request.is_ajax:


    post_id = request.GET.get('data')
    print("this is to check if the post_id is passed", post_id)
    print(request.GET.get)

    data = GetPostDetails(post_id)
    data = json.dumps(str(data))
    return JsonResponse(data, safe=False)
return JsonResponse({"error": "there was an error"}, status=status.HTTP_400_BAD_REQUEST)

Функция печати печатает эту строку.

this is to check if the post_id is passed None

<bound method MultiValueDict.get of <QueryDict: {'_': ['2345678976543']}>>
[04/May/2020 08:22:21] "GET /post/Post_details/?_=2345678976543 HTTP/1.1" 200 8

Кроме того, это заголовок запроса:

Request URL: // I removed it 
Request Method: GET
Status Code: 200 OK
Remote Address: 127.0.0.1:8000
Referrer Policy: no-referrer-when-downgrade
Response Headersview source
Content-Length: 8
Content-Type: application/json
Date: Mon, 04 May 2020 08:06:50 GMT
Server: WSGIServer/0.2 CPython/3.8.2
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Request Headersview source
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Cookie: //I removed it//
Host: 127.0.0.1:8000
Referer: http://127.0.0.1:8000/ // I removed it 
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: // I removed it 
X-Requested-With: XMLHttpRequest

ПРИМЕЧАНИЕ. У меня не было сообщений об ошибках, но json возвращает пустой объект, и когда я жестко закодировал post_id и сделайте это post_it = 1. У меня есть объект со всеми почтовыми деталями.
Ваши советы и рекомендации высоко ценятся.

Ответы [ 2 ]

1 голос
/ 04 мая 2020
Try this as Igor Moraru suggest, using post:


# Python

def post_details(request):
    if request.method == 'POST' and request.is_ajax:

        post_id = request.POST.get('post_id')

        data = GetPostDetails(post_id)
        data = json.dumps(str(data))
        return JsonResponse(data, safe=False)




// Java script


$(document).on('click', '#post-det', function(e) {

    e.preventDefault();

    var post_id = $(this).children(':first-child').text();
    var post_id = parseInt(post_id);

    $.ajax({
          type: "POST",
          url: "{% url 'get_post_details' %}",
          dataType: "json",
          data: {
              "post_id": post_id
          },
          success: function(data) {
             console.log(data);
          }
      });

});

// Send the csrftoken
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // 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;
}

var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
0 голосов
/ 04 мая 2020

Как видно из вашего запроса, данные не передаются в API. Вы можете использовать запрос POST для отправки данных. Метод GET не принимает параметр данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...