当我尝试在Django中使用Ajax发送POST请求时遇到了一些问题。我已经在这里研究了一些主题,但仍然找不到解决这些问题的方法。

这是我跟随this solution的javascript代码:

$.ajax({
    url: '{% url home %}',
    data: {selected_folders: formData,
           csrfmiddlewaretoken: '{{ csrf_token }}'},
    dataType: "json",
    type: "POST",
});


我也尝试solution from Django

$("form").submit(function() {
    var csrftoken = $.cookie('csrftoken');
    $.ajax({
        url: '{% url home %}',
        data: {selected_folders: formData,
               csrfmiddlewaretoken: csrftoken},
        dataType: "json",
        type: "POST",
    });
});


这是我的view.py

def home(request):
    if request.method == 'POST':
        Call_Other_Class()
    return render_to_response('home.html')


我的目标是将POST请求从home.html发送到自身,并且当home.html获得POST请求时,它将调用其他类来做其他事情。我不确定将CSRF令牌放在模板中的哪个位置,以及我在view.py中的代码是否正确。

感谢您的阅读并解决我的问题。

编辑:

我将JavaScript代码编辑为:

<script type="text/javascript" charset="utf-8">
    $(document).ready(function() {
      var csrftoken = Cookies.get('csrftoken');
      function csrfSafeMethod(method) {
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
      }
      $.ajax({
        url: '{% url home %}',
        data: {selected_folders: formData},
        beforeSend: function(xhr, settings) {
          if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
          }
        },
        dataType: "json",
        type: "POST",
      });
    });
</script>


HTML:

<form>
  <ul>
    <li id='key1'></li>
    <li id='key2'></li>
  </ul>
</form>


仍然不起作用。

最佳答案

对于Js:

$("form").submit(function() {
   $.ajax({
       url: '{% url home %}',
       data: {selected_folders: formData,
           csrfmiddlewaretoken: $("[name = csrfmiddlewaretoken]"),
        dataType: "json",
        type: "POST",
    });
});


对于view.py:

def home(request):
if request.method == 'POST' and request.is_ajax():
    Call_Other_Class()
return render_to_response('home.html')

关于javascript - 在Django中使用Ajax的POST请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32217741/

10-10 08:51