将变量客户端(JS Ajax)发送到服务器端(Python Django)

Posted

技术标签:

【中文标题】将变量客户端(JS Ajax)发送到服务器端(Python Django)【英文标题】:Sending variable Client Side (JS Ajax) to Server Side (Python Django) 【发布时间】:2020-06-09 14:34:21 【问题描述】:

我正在使用 Python 3.7.4 和 Django 3.0.3,并且我在前端应用程序中运行了一个 javascript 中的脚本 Ajax。当用户单击链接时,必须将变量发送到后端 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

在我的应用程序的 urlpattner 中

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

我做错了什么?

【问题讨论】:

您混淆了我提供的两种解决方案。您现在将 post_id 作为 path 参数 传递,但希望它作为 querystring 变量出现在您的视图中。请仔细阅读,如果仍然没有意义,请告诉我,我会尽力详细说明。 感谢@ReinstateMonica 帮助我,但错误仍然存​​在。我尝试了您给我的 2 个选项。但没有成功 好的,现在是。我使用 post_id 作为查询字符串。谢谢 【参考方案1】:

在您的 ajax 脚本中,您传递了一个名为 post_idquerystring 参数(例如 likePost/?post_id=1),但在您的 urlpatterns 中,您指定了 post_id 作为路径参数(例如likePost/1/)。

你有两个选择:

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') 

然后您可以在您的视图中通过request.GET 访问post_id

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

此外,如果您不确定要使用哪个选项,我建议您阅读When do I use path parameters vs. query params in a RESTful API?。

【讨论】:

我按照您的建议更改了我的 Ajax。现在我收到以下错误:未找到:/likepost/$catid [25/Feb/2020 16:47:58] "GET /likepost/$%7Bcatid%7D?post_id=1 HTTP/1.1" 404 2346 @RafaelChristófano 看起来您使用了双引号,例如。 "/likePost/$catid" 而不是反引号 @RafaelChristófano 我已经修改了我的答案,因此不使用 template string 语法。查看更新 另外,如果您不确定我在说什么,请参阅this question 尚未找到:/likePost/1 [25/Feb/2020 16:58:45] "GET /likePost/1 HTTP/1.1" 404 2311

以上是关于将变量客户端(JS Ajax)发送到服务器端(Python Django)的主要内容,如果未能解决你的问题,请参考以下文章

Js原生Ajax和Jquery的Ajax

JS原生Ajax

Js原生Ajax和Jquery的Ajax

如何以 GET 方法将数据从客户端发送到服务器端 - ajax

如何在不使用处理程序的情况下使用 ajax 从客户端将文件发送到服务器端?

JAVAWEB学习笔记22