Django: Ajax не получает данные из ответа сервера

Я новичок в Django и пытаюсь понять, как динамически добавлять контент из скрипта python без перезагрузки страницы.

В настоящее время в моем файле views.py есть две функции. Один обрабатывает загрузку файла (домашний), а другой обрабатывает вызов сценария python и обработку файла (дескриптора). Причина, по которой я разделил его таким образом, заключается в том, что я хочу последовательно заполнять HTML-таблицу, поскольку скрипт python работает с загруженным файлом.

Однако моя функция ajax не получает никаких данных из HTTP-ответа функции дескриптора, и я не уверен, почему. Ни функции успеха, ни ошибки не вызываются. Это действительно странно, потому что оператор print в функции handle в views.py успешно печатается с данными.

Views.py

i=0
uploaded_file = None


def home(request):

    if (request.method == 'POST'):
        file_form = UploadFileForm(request.POST, request.FILES)
        if file_form.is_valid():
            global uploaded_file
            uploaded_file = request.FILES['file']
            print(uploaded_file)
    else:
        file_form = UploadFileForm()

    return render(request, 'personal/home.html', {'form': file_form})



def handle(request):

    # TODO make ajax wait for a response from 'home'
    # so I don't have to wait for 1 second  
    time.sleep(1)
    data = {}
    data['Name'] = fileName(uploaded_file)
    if (request.is_ajax()):
        print(data)        # prints succesfully
    return HttpResponse(json.dumps(data), 
content_type = "application/json")

home.html

        <script type = "text/javascript" language = "javascript">

        function post_tables(data) {
            alert(data)
        }


         $(document).ready(function(post_tables) {
            $("#upload").click(function(event){
               $.ajax( {
                  contentType: "application/json; charset=utf-8",
                  dataType: "json",
                  type: "get",
                  url:'/handler',
                  success: function(data) {
                     console.info("over here")
                     post_tables(data)
                  },
                  error: function(data) {
                      console.info("down here")
                      post_tables("error being thrown")
                  }
               });
            });
         });
        </script>

urls.py

urlpatterns = [
    path(r'', views.home, name='home'),
    path(r'handler', views.handle, name='handle'),
]

Вы не показали достаточно шаблона, чтобы увидеть, что не так с Ajax, но вы абсолютно не должен используете такую ​​глобальную переменную, чтобы сохранять состояние между запросами.

Daniel Roseman 06.05.2018 13:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
1 186
1

Ответы 1

Я объяснил вам весь процесс ajax django. Возможно, ваша проблема будет решена. удачи.

views.py

def handle(request):
    if request.method == 'POST':
        data = request.POST
        field_example = data.get('field_example')

        return JsonResponse(data)
    else:
        data = request.GET
        field_example = data.get('field_example')
        return JsonResponse(data)

home.html

<form id = "upload">
   {% csrf_token %}
   <input type = "text" name=field_example>
   .
   .
   .
</form>

urls.py

urlpatterns = [
    path(r'', views.home, name='home'),
    path(r'handler/', views.handle, name='handle'),
]

js в home.html:

$("#upload").submit(function (e) {
    e.preventDefault();
    var formData = new FormData(this);

    $.ajax({
        url: "{% url 'handle' %}",

        type: 'GET',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        success: function (data) {
            console.info("over here")
            post_tables(data)
        },
        error: function (data) {
            console.info("down here")
            post_tables("error being thrown")
        }
    });
});

Во-первых, спасибо, что ответили так быстро. Во-вторых, я не уверен, почему переменная field_example нигде не используется. Также как мне отправить данные обратно в функцию ajax через ответ Json? В этом примере ничего не отправляется обратно. В целях тестирования я пытаюсь вернуть имя файла, выполнив что-то вроде: data = {} data ['Name'] = fileName (uploaded_file) # функция, которую я определил return JsonResponse (data)

Alex Pinto 06.05.2018 20:59

Я отправляю поля field_example в js-коде переменной formData. Если вам нужно отправить поле coustom по значению, сделайте это так: $ .ajax ({url: "{% url 'handle'%}", тип: 'GET', data: {"example_field": "value_example", "example_field2] ":" value_example2 ",},...

rmaleki 07.05.2018 08:41

Другие вопросы по теме