Как загрузить загруженный Ajax массив JSON из представления Django/Python в DataTable

#javascript #python #json #ajax #datatable

Вопрос:

Я новый разработчик, и это мой первый профессиональный проект, а также первый в Django. Я пытаюсь загрузить данные, которые я извлек из своих моделей.пай в моем view.py к датируемому. Вот мой код.
Вот мой views.py

 def recordingDataTable(request):
    if request.is_ajax and request.method == "GET":
        vicidial_agent_log = VicidialAgentLog.objects.filter(event_time__gte='2021-04-16 16:00:00').values('user', 'server_ip')
        structure = json.dumps(list(vicidial_agent_log), cls=DjangoJSONEncoder)
        
        return JsonResponse(structure, status = 200, safe=False)
    
    return JsonResponse({}, status = 400)
 

Вот JSON, который возвращается

 "[{"user": "8045", "server_ip": "168.119.48.158"}, {"user": "8047", "server_ip": "168.119.48.158"},]"
 

Вот мой шаблон

 <table id="recording_datatable" class="table table-striped table-bordered" style="width:100%">
    <thead>
        <tr>
            <th>Username</th>
            <th>Server IP</th>
        </tr>
    </thead>
    <tbody>
    
    </tbody>
    
    <tfoot>
        <tr>
            <th>Username</th>
            <th>Server IP</th>
        </tr>
    </tfoot>

</table>
 

Наконец, вот мой сценарий

 $(document).ready(function() {
    $.ajax({
        'url': "{% url 'recordings:recordingDataTable' %}",
        'method': "GET",
        'dataType': "JSON",
        'contentType': 'application/json',
        
    }).done( function(data) {
        alert(data);
        
        $('#recording_datatable').DataTable({
            data: data,
            dataSrc: "",
            columns: [
                { data: "user" },
                { data: "server_ip" },
            ]
                
        });

    })
});
 

Всякий раз, когда я запускаю свой код, я получаю следующую ошибку:
Предупреждение о таблицах данных: идентификатор таблицы=recording_datatable — Запрошенный неизвестный параметр «пользователь» для строки 0, столбца 0. Для получения дополнительной информации об этой ошибке.
Я уже реализовывал DataTable ранее из PHP и, похоже, все делаю правильно. Я просто не знаю, почему это не работает. Я посетил почти каждый документ здесь, Stackoverflow и Datatables.net и по какой-то причине, похоже, никакая реализация не работает.

Я знаю, что это окажется простой ошибкой, но эта проблема заняла большую часть моих 3 дней. Любая помощь будет очень признательна. Спасибо.

Комментарии:

1. Ваш код JavaScript выглядит нормально. Но ваш JSON на самом деле не является JSON — это строковое представление JSON (и оно неполное, но, возможно, это просто отредактированная версия вопроса). Почему вы используете json.dumps ? Вы должны передавать массив объектов в JsonResponse, [ {"user": "Joe" }, { "user": "Jane" } ] а не передавать строку.

2. О боже! Я законно только что сделал это, и это кажется таким глупым. Да, это не JSON. Я просто преобразовал его в JSON вот так, и это сработало. const parsedData = JSON.parse(data); . Я использовал json.dumps() из-за решения, которое я нашел в Интернете. Я думаю, что мой Python или веб-разработка должны быть сильно отточены. Спасибо, парень, за твою помощь. Наконец, можете ли вы помочь мне, почему мой return JsonResponse(structure, status = 200, safe=False) JSON не возвращается в мой шаблон?

Ответ №1:

Я нашел решение благодаря помощи @andrewjames. Я передавал строку вместо ответа JSON. Может быть, ошибка новичка.

Я использовал json.dumps() в своем views.py файл, потому что я хотел сериализовать объект перед передачей его в JsonResponse (), но это была неправильная реализация. Сначала я изменил строку на JSON в шаблоне, const parsedData = JSON.parse(data); и мои данные заполнили таблицу данных. Как только я осознал свою ошибку, я в конце концов отредактировал свой views.py файл для отправки JsonResponse (), и я сделал это следующим образом.

 def recordingDataTable(request):

    if request.is_ajax and request.method == "GET":
        vicidial_agent_log = VicidialAgentLog.objects.filter(event_time__gte='2021-04-16 16:00:00').values('user', 'server_ip')
        return JsonResponse(list(vicidial_agent_log), status = 200, safe=False)
    return JsonResponse({}, status = 400)