【问题标题】:Sending variable Client Side (JS Ajax) to Server Side (Python Django)将变量客户端(JS Ajax)发送到服务器端(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 作为查询字符串。谢谢

标签: django python-3.x ajax


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2015-03-25
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多