Отправка переменной на стороне клиента (JS Ajax) на сторону сервера (Python Django) - PullRequest
1 голос
/ 25 февраля 2020

Я использую Python 3.7.4 с Django 3.0.3, и у меня есть скрипт Ajax в javascript, запущенный в приложении переднего плана. Когда пользователь щелкает ссылку, переменная должна отправляться на сервер python. См. Пример

Javascript

$('.likebutton').click(function() {
    var catid;
    catid = $(this).attr("data-catid");
    $.ajax({
        type: "GET",
        // url: "/likePost",
        url: "/likePost/" + catid,
        /* data: {
            post_id: catid
        },
        */   
        success: function(data) {
            $('#like' + catid).remove();
            $('#message').text(data);
        }
    })
});

urls.py

В URL-адресе приложения, которое у меня есть

urlpatterns = [
    path('', views.index, name='index'),  # index view at /
    path('likePost/', views.likePost, name='likepost'),   # likepost view at /likepost
]

views.py

def likePost(request):
    if request.method == 'GET':
        post_id = request.GET['post_id']
        likedpost = Post.obejcts.get(pk=post_id) #getting the liked posts
        m = Like(post=likedpost) # Creating Like Object
        m.save()  # saving it to store in database
        return HttpResponse("Success!") # Sending an success response
    else:
        return HttpResponse("Request method is not a GET")

При отладке я получил следующее сообщение об ошибке

Not Found: /likePost
[25/Feb/2020 16:12:17] "GET /likePost?post_id=1 HTTP/1.1" 404 2335

Что я делаю не так?

1 Ответ

2 голосов
/ 25 февраля 2020

В вашем скрипте ajax вы передаете параметр querystring с именем post_id (например, likePost/?post_id=1), но в своих URL-адресах вы указываете post_id в качестве параметра пути (например, likePost/1/).

У вас есть 2 варианта:

post_id в качестве параметра пути

Добавьте post_id к URL вместо отправки его в качестве данных:

$('.likebutton').click(function() {
    var catid;
    catid = $(this).attr("data-catid");
    $.ajax({
        type: "GET",

        // standard syntax
        url: "/likePost/" + catid,

        // template string syntax
        // url: `/likePost/${catid}`,

        success: function(data) {
            $('#like' + catid).remove();
            $('#message').text(data);
        }
    })
});

Затем добавьте post_id в ваш взгляд:

def likePost(request, post_id):
    ...

post_id как строка запроса

измените ваш путь на следующее:

path('likePost/', views.likePost, name='likepost') 

Вы можете получить доступ к post_id через request.GET по вашему мнению:

def likePost(request):
    post_id = request.GET['post_id']
    ...

Кроме того, я бы рекомендовал прочитать Когда я использую параметры пути и параметры запроса в RESTful API? , если вы не уверены, какой вариант использовать.

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