Django:尽管提供了令牌,CSRF验证仍失败

时间:2020-04-24 00:13:05

标签: html jquery django ajax

尽管在ajax调用中进行了令牌显式声明,但由于csrf_token验证失败而导致出现403错误。我在其他功能中以同样的方式使用数据字典,效果很好。

这是JS:

$(document).on("click", ".update-cleaning", function(event){
  event.preventDefault();
  var input_field_name = $(this).attr('name')
  var obj_id = $(this).attr('value')
  var model_name = $(this).attr('data-model')
  var field_name = $(this).attr('data-field')
  var value = $("#" + input_field_name + obj_id).val();
  if (!value) {
      alert('Fill the field!')
    }
  else {
  $.ajax({
            url: "{% url 'ajax_update_cleaning' %}",
            type: "POST",
            data: {'object_id': obj_id, 'model_name': model_name, 'field_name': field_name, 'value': value, 'csrfmiddlewaretoken': '{{ csrf_token }}'},
            dataType: 'json',
        })
        .done(function(response){
                    console.log(response);
                })
        }
});

我的html表单处于一个弹出窗口中,可通过单击<td>来切换,其外观如下:

<td class="text-md-center with-popover" name="frequency" value="{{cleaning.id}}">
    {{ cleaning.frequency }}
    <div id="frequency{{cleaning.id}}" style="display: none">
    <form method="POST">
    <label for="cleaning_frequency">Frequency: </label>
    <input id="cleaning_frequency{{cleaning.id}}" type="number" name="cleaning" value="{{cleaning.frequency}}"> 
    <button type="submit" class="btn btn-success btn-sm update-cleaning" name="cleaning_frequency" data-model="Cleaning" data-field="frequency" value="{{cleaning.id}}"> Change </button>
    </form>
  </div>
</td>

能给我一些想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在任何使用POST表单的模板中,如果表单用于内部URL,请在元素内使用csrf_token标记,例如:

<form method="post">{% csrf_token %}

Django Documentation

中了解更多信息