尝试通过ajax(fetch)将数据保存在Django中时出错

时间:2020-06-25 22:48:32

标签: python django ajax django-models

我有一个引用其他模型的模型,我正在尝试使用ajax保存数据

示例:

class Friend(models.Model):
    name = ...

class Main(models.Model):
    name = ....
    friend = models.ForeignKey(Friend, on_delete=models.CASCADE)

所有主体均来自ajax(fetch)请求

我有一个表格(html),并将数据添加到单元格中,然后使用 输入事件,发送数据。

赞:

input.addEventListener("keyup", function (e) {
  //in this scenario I already have the whole row
  // get full_row `row_data`
  post_ajax = {
    method: "POST",
    headers: {
      "X-CSRFToken": crf_token, // I get it with a regular expression
      "Content-Type": "application/json",
      "X-Requested-With": "XMLHttpRequest",
      Accept: "application/json",
    },
    body: JSON.stringify(row_data),
  };

  fetch("my_url", post_ajax)
    .then((res) => res.json())
    .catch((error) => console.error("Error:", error))
    .then((response) => console.log("Success:", response));
});

我的查看功能

def save_post(request):
    if request.is_ajax and request.method == "POST":
        body_unicode = request.body.decode('utf-8')
        data = json.loads(body_unicode)      
        print('here the data arrives',data)
        # here the data arrives {'name': 'Ale', 'friend_id': 22}
        Main.objects.create(name=data['name'], friends=data['friend_id'])

        return JsonResponse({"instance": data}, status=200)

    return JsonResponse({"error": ""}, status=400)

这是错误

raise TypeError("%s() got an unexpected keyword argument '%s'" %
                (cls.__name__, kwarg))
TypeError: Main() got an unexpected keyword argument 'Friends'

有什么想法或建议吗?

1 个答案:

答案 0 :(得分:2)

编辑:

在创建select max(acount) acount, max(bcount) bcount from mytable 对象时,请尝试使“ Main”属性成为对象,例如:

friend

另外,主要问题似乎是您正在呼叫“ 朋友”列,但是在创建friend = Friend.objects.get(id=data['friend_id']) Main.objects.create(name=data['name'], friend=friend) 时应该是“ friend ”对象。

此:

Main

应该是:

 Main.objects.create(name=data['name'], friends=data['friend_id'])

上级答案:

假设您未在模板中使用JQuery发送AJAX请求,

在您的urls.py中:

 Main.objects.create(name=data['name'], friend=data['friend_id'])

在您的模板中:

...
path('/api/post_friend/', post_friend_api, name="post_friend_api"),
...

在您的views.py:

<script type="text/javascript">
        $("#myBurron").click(function(){
            var csrfToken = $( "input[name='csrfmiddlewaretoken']"); // assuming this is a form
            var friend_name = $("#friend_name").val();
                $.ajax({ url: '{% url 'post_friend_api' %}',
                                    type: "POST",
                                    dataType: "json",
                                    data: {'friend':friend_name, 'csrfmiddlewaretoken':csrfToken.val()},
                                    cache: false
                           }).done(function(data) {
                                if (data.result === true){
                                    alert(data.message);
                               }
                           });
                      });
                  });
            </script>

通过POST发送数据时,请不要忘记像上面的示例一样传递CSRF令牌。假设您在页面上有一个表单可以从中获取,否则您可以使用类似的方式获取它:

        from django.http import JsonResponse

        def post_friend_api(request):
              data = {}
              if request.POST.get('friend', None) is not None:
                  friend_name = request.POST.get('post_note')
                  # save the object and indicate success
                  data['result'] = True
                  data['message'] = "Friend saved successfully"
                  ...
              if request.is_ajax():
                 return JsonResponse(data)
              else:
                 return HttpResponseBadRequest()

如果您不想处理CSRF令牌,则可以使用function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i].trim(); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken'); 装饰器标记视图,并从模板中的Ajax调用中删除“ @csrf_exempt”数据元素,但是它可能不是理想的,也不是最安全的。一个例子:

csrfmiddlewaretoken

如果您发布更多详细信息,我可以更新我的答案。