Куда мне нужно передать запрос?

#javascript #python #ajax

#javascript #python #ajax

Вопрос:

Когда я нажимаю на кнопку, я пытаюсь активировать функцию, которая будет передавать данные в шаблон и открывать его. Вот функция нажатия кнопки:

 function openForm () {

    const amount = select.value;

    $ .ajax ({
        url: '/ create_order /',
        type: 'get',
        data: {'amount': amount},
        dataType: "json",
        xhrFields: {withCredentials: true},
        success: function (data) {
            if (data ['content']) {
                $ ('body'). append (data ['content']);
                console.log (data ['content'])
            }
        },
    });
}
  

urls.py

 url (r '^ create_order /', CreateOrder),
  

views.py

 def CreateOrder (amount, request):
    count = amount.GET.dict ()

    content = mark_safe (render_to_string (
        'form.html',
        {
            'amount': count ['amount'],
        },
        request))
  

Вопрос в параметре запроса. Мне это нужно в последней строке, поэтому мне нужно передать его в функцию CreateOrder . Но именно так возникает ошибка

 TypeError at / create_order / ↵CreateOrder () missing 1 required positional argument: 'request'
  

Подскажите, как я могу передать запрос в openForm () функции или как это правильно сделать по-другому?

Ответ №1:

Проблема в urls.py

 url (r '^ create_order /', CreateOrder),
  

Это вызовет CreateOrder (amount, request): передачу вместо первого аргумента amount request запроса, который был сделан (не любое число)

вам нужно изменить свой urls.py чтобы вместо этого иметь дополнительный параметр amount после /

 from django.urls import path

path(r '^ create_order /<int:amount>', CreateOrder), #takes a number after the slash
  

Затем это приведет к правильному вызову ваших функций, передаваемых в качестве аргументов amount и request соответственно.

РЕДАКТИРОВАТЬ: первый аргумент должен быть request not amount , поэтому вы должны изменить его на

 def CreateOrder (request,amount):
  

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

1. Я делаю это path ('create_order / <int: amount>', CreateOrder), , но мой отладчик даже не переходит в CreateOrder, а responseText выглядит так <! DOCTYPE html> <html lang = "en"> <head> <meta http-equiv = "content-type" content = "text / html; charset = utf-8"> <title> Page not found at / create_order / </title>

2. Вам нужно выполнить Ajax /create_order/<int:amount>/ прямо сейчас, в котором вы это делаете, create_order/ который не найден, также не уверен, является ли это проблемой, следите за своими пробелами.

3. Я начинающий специалист, поэтому я очень извиняюсь за глупость) вот JavaScript ` $.ajax({ url: ‘/create_order/’, тип: ‘get’, данные: {‘amount’: amount}, Тип данных: «json», успех: функция (данные){ if (data[‘content’]) { $(‘body’).append(data[‘content’]); console.log(data[‘content’]) } }, }); }` вот URL path('/create_order/<int:amount>', CreateOrder), -адреса и все та же ошибка. Что не так, пожалуйста, помогите?

4. { url: '/create_order/${amount}' Это добавит сумму к текущему URL -адресу примерно так create_order/5000 , и def CreateOrder (request,amount): теперь будет иметь amount в качестве аргумента. Но, насколько я понимаю, вам на самом деле не нужно добавлять amount к текущему URL -адресу, поэтому лучшей идеей было бы полностью удалить его из представления и URL-адреса и просто получить доступ к данным через amount = request.GET.get("amount") .

5. Большое вам спасибо! И что делать с этой ошибкой, не подскажите пожалуйста? Какой HttpResponse будет правильным способом возврата? ValueError at / create_order / ↵The view project.views.CreateOrder didn't return an HttpResponse object. It returned None instead.