【问题标题】:Ajax returning empty string in Django viewAjax 在 Django 视图中返回空字符串
【发布时间】:2019-10-28 21:36:11
【问题描述】:

我正在通过 Django 开发一个 Web 应用程序,我想从我的 javascript 中获取信息到 Django 的视图中,以便访问数据库。

我使用 ajax 调用作为this post shows。 我通过 onclick 事件调用 html 中的 js:

sortedTracks.html

     ...
    <form action="{% url 'modelReco:sortVideo' video.id %}">
        <input type="submit" value="Validate" onclick="ajaxPost()" />
    </form>
    ...

clickDetection.js

//defined here
var tracksSelected = [];

//function that fill tracksSelected
function tagTrack(track_num){
  if(tracksSelected.includes(track_num)){
    var index = tracksSelected.indexOf(track_num);
    tracksSelected.splice(index, 1);
  }else{
      tracksSelected.push(track_num);
  }};

//ajax function
function ajaxPost(){
$.ajax({
    method: 'POST',
    url: '/modelReco/sortedTracks',
    data: {'tracksSelected': tracksSelected},
    success: function (data) {
         //this gets called when server returns an OK response
         alert("it worked! ");
    },
    error: function (data) {
         alert("it didnt work");
    }
});
};

所以我要传输的信息是tracksSelected,是一个像[21,150,80]这样的int数组

views.py

def sortedTracks(request):
if request.is_ajax():
    #do something
    print(request)
    request_data = request.POST
    print(request_data)

    return HttpResponse("OK")

ajax 帖子运行良好,但我得到的答案只是一个像这样的空查询字典:
&lt;QueryDict: {}&gt; 如果我打印我得到的请求:

&lt;WSGIRequest: GET '/modelReco/sortedTracks/?tracksSelected%5B%5D=25&amp;tracksSelected%5B%5D=27&amp;tracksSelected%5B%5D=29'&gt;

我也尝试更改为request_data=request.GET,但我得到了一个奇怪的结果,数据现在位于tracksSelected[]

【问题讨论】:

  • 为什么不尝试直接在视图中访问密钥?例如request.POST.get('tracksSelected')request.GET.get('tracksSelected')
  • 您没有阻止默认表单提交
  • 如果您希望通过 Ajax 提交数据,为什么还要使用表单操作?
  • 如果我这样做'request.POST.get('tracksSelected)'。它返回我 None 因为 QueryDict 是空的。表单操作是为了验证您在必须点击不同内容的网页上所做的选择。我是新人,所以也许我没有从你说的内容中抓住重要的东西。
  • 你在那个JS中定义tracksSelected在哪里?

标签: javascript python django ajax


【解决方案1】:

我试图知道为什么如果我在做request_data=request.GET,我会得到像tracksSelected[] 这样的数据并且只得到它的最后一个元素。

我找到了一种方法来避免在我的数据中包含一个数组(tracksSelected)on this link 这使我能够:

在views.py中

def sortedTracks(request):
if request.is_ajax():
    #do something
    print(request)
    request_data = request.GET.getlist("tracksSelected")[0].split(",")
    print(request_data)

在 clickDetection.js 中

function ajaxPost(){
tracksSelected = tracksSelected.join();
$.ajax({
    method: 'POST',
    url: '/modelReco/sortedTracks',
    data: {'tracksSelected': tracksSelected},
    success: function (data) {
         //this gets called when server returns an OK response
         alert("it worked! ");
    },
    error: function (data) {
         alert("it didnt work");
    }
});
};

这个小技巧有效,我可以像这样得到数组数据, print(request_data) 返回我的数组如[21,25,27]

谢谢你帮助我!

【讨论】:

    【解决方案2】:

    根据我的访问,ajax请求中发送的数据可以直接访问。 例如:

    def sortedTracks(request):
        if request.method == 'POST':
            usersV = request.POST.get('tracksSelected')[0]
    
                for users in usersV:
                    print users
            return HttpResponse("Success")
        else:
            return HttpResponse("Error")
    

    正确的语法是data: {tracksSelected:tracksSelected},

    【讨论】:

      猜你喜欢
      • 2014-09-09
      • 2013-03-01
      • 1970-01-01
      • 2020-08-13
      • 2018-09-06
      • 2016-07-21
      • 2012-02-29
      • 2016-03-21
      • 1970-01-01
      相关资源
      最近更新 更多