Ajax-запрос не возвращает HttpResponse - PullRequest
0 голосов
/ 06 октября 2018

Я кодирую веб-приложение Django только с одной страницей.Эта страница содержит форму с некоторыми входными данными.Когда я нажимаю кнопку отправки, я выполняю ajax-вызов функции в python.Я хочу получить некоторые данные из этой функции.

HTML-файл:

<form id="strategy" method="post" class="edit_user">
  {% csrf_token %}
  <div class="sel-schedule">
    <label>Label: </label>
    <input id="start_time" type="time" name="start_time" value="09:30" required>
  </div>
  <button type="submit" class="inactive boton-lanzar">Launch</button>
</form>

JS-файл :

$('#strategy').on('submit', function(event){
    var start_time = document.getElementsByName("start_time")[0].value;
    var url = '/method_calculation/';
    $.ajax(url, {
        data: {
            'start_time': start_time,
        },
        dataType: 'json',
        success: function (data) {
          console.log("new")
        }
    })
});

Файл URL:

urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
path('method_calculation/', method_calculation, name="method_calculation"),
]

Просмотр файла:

def home(request):
    if request.method == "GET":
        return render(request, 'index.html')
    else:
        return HttpResponse("OK")


def method_calculation(request):
    if request.method == 'POST':

        start_time_hour = int(request.POST.get('start_time')[0:2])
        start_time_minute = int(request.POST.get('start_time')[3:5])
        data_comparison = caculate_summit(start_time_hour, start_time_minute)

        args = {data_comparison}
        return JsonResponse(args)

Я немного запутался.

Во-первых, я не хочу, чтобы страница перезагружалась, но если я извлекаю возвращаемый HttpResponse, он говорит, что он ему нужен.

Во-вторых, с текущими файлами я получаю следующую ошибку:

The view myapp.views.method_calculation didn't return an HttpResponse object. It returned None instead.

Чего мне не хватает?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Вот что я делаю, когда делаю почтовый запрос в Ajax для моих проектов Django.Согласно документации django (https://docs.djangoproject.com/en/2.1/ref/csrf/), лучший способ получить токен csrf - использовать эту функцию:

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;
}

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

Затем я создал функцию поста ajax с этим:

function postAjaxJson(url, data, is_csrf, callback) {
    if (is_csrf) {
        var csrftoken = getCookie('csrftoken');
        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });
    }
    $.ajax({
        url: url,
        type: "POST",
        contentType: "application/json",
        data: JSON.stringify(data),
        success: function(response) {
            callback(response);
        },
        error: function () {
            console.error("Erreur réseau avec l'url" + url);
        }
    })
}

Обычно я отправляю свои данные в формате JSON. И, по вашему мнению, вы найдете данные из своего сообщения ajax в request.body , а не в request.POST:

import json
def method_calculation(request):
    if request.body:

        ...
        # if json data = json.loads(request.body)
        ...
        return JsonResponse(args)

Я надеюсь, что это поможет вам решить вашу проблему!

0 голосов
/ 06 октября 2018

Ваш AJAX-вызов делает запрос GET, и функция просмотра не обрабатывает этот случай.В результате он возвращает None и, следовательно, ошибку.

Таким образом, вам необходимо указать тип запроса в вызове $.ajax:

$.ajax(url, {
    <b>type: "POST",</b>
    data: {
        start_time: start_time,
        <b>csrfmiddlewaretoken: '{{ csrf_token }}'</b>
    },
    dataType: 'json',
    success: function (data) {
      console.log("new")
    }
})

На основании вашего комментария вытакже необходимо указать токен CSRF (учитывая, что JavaScript отображается с шаблоном, выше должно работать).

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