【问题标题】:Using Ajax to send data to a Django model使用 Ajax 将数据发送到 Django 模型
【发布时间】:2020-03-10 06:26:02
【问题描述】:

我创建了以下 Ajax 请求以将数据发送到我的 views.py。发送请求后,视图应将其保存在我的数据库中。我的实际代码的问题是我在表单中提交的值没有被保存。

这是我尝试过的: HTML/JS

<script>
$(document).ready(function () {

  $("#test").submit(function (event) {
    $.ajax({
      type: "POST",
      url: "/ajtest/",
      data: { csrfmiddlewaretoken: "{{ csrf_token }}",
            state:"inactive",
        data: $('#test').serialize(),
      },
      success: function () {
        $('#message').html("<h2>Submitted.</h2>")
      }
    });
    return false; 
  });

});
</script>

<form method='post' id='test'>
  {% csrf_token %}
  <input type="text">
  <input type='submit' value='Test button'/>
  <div id='message'>Initial text</div>
</form>

这是视图

def ajtest(request):
    if request.method == 'POST':

        model = MyModel()
        model.value = request.POST['data']
        model.user = request.user
        model.save()

        messages.success(request, f"Success!!")

    else:
        messages.success(request, f"Error")
    return HttpResponse('ok')

这里,user 正在被保存。当我点击 Ajax 表单时,我看到数据库中出现了一条新记录,问题是,在 value 列中我没有看到表单中提交的数据,而是我会看到一个空白字段或,现在,请求的 CSRF 令牌。有人可以帮我找到问题吗?我确定它在 Ajax 请求中。

【问题讨论】:

    标签: jquery django ajax post


    【解决方案1】:

    请尝试以下代码 sn-p。

    <script>
      function getCookie(cname) {
        var name = cname + "=",
         decodedCookie = decodeURIComponent(document.cookie),
         ca = decodedCookie.split(';');
         for(var i = 0; i <ca.length; i++) {
           var c = ca[i];
           while (c.charAt(0) == ' ') {
            c = c.substring(1);
          }
          if (c.indexOf(name) == 0) {
           return c.substring(name.length, c.length);
        }
      }
      return "";
     }
    
    
      // Generic Function to process Ajax Calls
      function callAJAX(url, header, parameters, req_type, successCallback, 
        beforeSendCallback, completeCallback ) {
        jQuery.ajax({
        type : req_type,
        url : url,
        headers : header ,
        data :  parameters,
        beforeSend : beforeSendCallback,
        complete : completeCallback,
        success : successCallback,
        error : function(xhr, textStatus, errorThrown) {
            console.log( 'error' + textStatus + ' ' + xhr + ' ' + errorThrown );
        },
        async: false
      });
     }
    
    
     $(document).ready(function () {
        $("#test").submit(function (event) {
            callAJAX( "/ajtest",
             {"X-CSRFToken": getCookie("csrftoken") },
             parameters={'data': $('#text_box').val()},
            'post',
             function(data){
               $('#message').html("<h2>Submitted.</h2>");
    
             }, null, null );
     return false; 
    });
    
    
     });
    </script>
    
    <form method='post' id='test'>
     {% csrf_token %}
     <input type="text" id='text_box' name='input_val'>
     <input type='submit' value='Test button'/>
    <div id='message'>Initial text</div>
    </form>
    

    【讨论】:

    • 嘿!谢谢你的回答,你能解释一下前两个功能吗? getCookie 和 callAJAX 是做什么的?
    • @jack022,两者都是从html文档和ajax调用中获取cookie的通用函数。
    • 试过这个。这是我的 django 视图的响应:MultiValueDictKeyError at /ajtest/'data'
    • @jack022,请使用 /ajtest ,不要使用这个 /ajtest/
    • 看起来我做不到,原因如下:“您通过 POST 调用了此 URL,但该 URL 没有以斜杠结尾,并且您设置了 APPEND_SLASH。Django 无法重定向到斜杠 URL,同时维护 POST 数据。将表单更改为指向 127.0.0.1:8000/ajtest/(注意尾部斜杠),或在 Django 设置中设置 APPEND_SLASH=False。"
    【解决方案2】:

    您需要将name属性添加到&lt;input type="text"&gt;

    来自 jquery docs:

    对于要包含在序列化字符串中的表单元素的值, 该元素必须具有名称属性。

    添加名称属性为,

    <form method='post' id='test'>
      {% csrf_token %}
      <input type="text" name="value">
      <input type='submit' value='Test button'/>
      <div id='message'>Initial text</div>
    </form>
    

    这是演示小提琴https://jsfiddle.net/nawarkhede/ajfvs58c/2/ .我可以看到正在传递数据。

    【讨论】:

    • 很公平,但是我应该在我的 ajax 请求中编辑什么?
    • 好的,但我还需要在 ajax 请求中编辑一些内容。我的 django 客户端仍然看不到我提交的值
    猜你喜欢
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多