Как обрабатывать AJAX POST-запрос в Django - PullRequest
2 голосов
/ 06 мая 2020

В моем приложении есть что-то вроде кнопки твиттера, так что при нажатии кнопки запускается вызов AJAX и выполняется действие, указанное в представлениях. Однако, когда я нажимаю кнопку, она не выполняет действий в представлениях. Код достигает "подобного представления", но ничего не выполняет после "if request.POST:". Пожалуйста, помогите.

Меню. html

<form action="{% url 'like'%}" id="plt_{{menu.id}}" data-id="{{menu.id}}" method="post">
        {%csrf_token%}
   <input name="menu_id" type="hidden" value="{{ menu.id }}">
    <div class="like-button" id="btn_{{menu.id}}"></div>
</form>
<script>
     $('.like-button').on('click', function () {
         var id = $(this).attr('id');
         id = id.replace('btn_','');

         $(this).toggleClass('animate').promise().done(function () {
            var link = $("#plt_"+id).attr('action')
                $.ajax({
                    type: 'POST',
                    url: link,
                    headers: {'X-CSRFToken': '{{ csrf_token }}'},
                })
                });
    });

 </script>

Views.py

def like(request):
    print('reached') //this prints
    if request.POST:
     menu = Menu.objects.get(pk=request.POST.get('menu_id'))
     //execute code to like
     return HTTPResponse('')

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Может быть, вы хотите проверить, что

if request.is_ajax() and request.method== "POST":

request.POST - это dict. Пусто, потому что тело вашего запроса пусто.

Пустые dicts обрабатываются как False by python like

if {}:
    print("Hello World") 

Выше ничего не печатать

Но ниже работает

if {"hi" : "there"}:
    print("Hello World")

и docs предполагает, что эта проверка неверна if request.POST:

Возможно, что запрос может поступить через POST с пустым словарем POST - если, скажем, форма запрашивается через метод POST HTTP, но не включает данные формы. Следовательно, вы не должны использовать if request.POST для проверки использования метода POST; вместо этого используйте if request.method == "POST" (см. HttpRequest.method).

0 голосов
/ 06 мая 2020

Это довольно просто, используйте serialize() из jquery. Функция сериализации будет принимать все значения из формы, даже csrftokenmiddleware, который является скрытым типом ввода. Таким образом, вы сможете успешно обработать запрос post. Используйте sthg следующим образом:

<script>
     $('.like-button').on('click', function () {
         var id = $(this).attr('id');
         id = id.replace('btn_','');

         $(this).toggleClass('animate').promise().done(function () {
            var link = $("#plt_"+id).attr('action');
            var data = $("#plt_"+id).serialize();   // It will serialize all form data
                $.ajax({
                    type: 'POST',
                    url: link,
                    data: data
                });
         });
    });

 </script>

В views.py выполните те же действия, что и для другого запроса. сериализовать ()

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