Saya telah membuat form di template dengan tag {% csrf_token %}, output form seperti di bawah ini:

 <form id="appl_detail13" action="/13/devices/" method="post">
    <input type="hidden" name="csrfmiddlewaretoken" value="gTOpBTi6rljV5dKsGE0kuzD1IkghAlzW7GdiBZw6pMMaMUxJSlVev5YqPef6jhjb">
   <input name="appl_checkbox" id="5" type="checkbox" class="form-check-input applcheck" value="13"> 
</form>

Pada klik kotak centang saya melakukan permintaan ajax, tetapi saya tidak mengirim token csrf:

$(".applcheck").click(e=>{
    $.post('/13/devices/',{data:'postedvalue'}, data=> {
        console.log(data)
    })
})

Pemeta Url:

urlpatterns = [
    # ex: /13/devices/
  path('<int:application_id>/devices/', views.ApplicationDetail, name='application-detail'),
]

Pandangan saya menerima permintaan dan harus mengirim JSON.

def ApplicationDetail(request, application_id):
     if request.method == 'POST':
        device = Device.objects.all().filter(application_id=application_id)
        data = serializers.serialize('json', device)

        return HttpResponse(data, content_type='application/json')
     else:
        return HttpResponse('no posted')

Jadi saya mendapatkan kesalahan di bawah ini:

enter image description here

P.S. Saya tahu ada banyak tutorial tentang ini, tetapi banyak di antaranya sudah usang dan ada tautan yang rusak.

1
Andd 14 Januari 2020, 11:08

3 jawaban

Jawaban Terbaik

Anda perlu menambahkan CSRF di header panggilan ajax coba ini -

(function() {
  $.ajaxSetup({
      headers: { "X-CSRFToken": getCookie("csrftoken") }
  });

  function getCookie(c_name)
  {
  if (document.cookie.length > 0)
  {
      c_start = document.cookie.indexOf(c_name + "=");
      if (c_start != -1)
      {
          c_start = c_start + c_name.length + 1;
          c_end = document.cookie.indexOf(";", c_start);
          if (c_end == -1) c_end = document.cookie.length;
          return unescape(document.cookie.substring(c_start,c_end));
      }
  }
  return "";
  }
}());
3
Pankaj Sharma 14 Januari 2020, 08:14

Di mana data yang Anda kirim?

0
Ubaid Parvaiz 14 Januari 2020, 08:15

Jika Anda menelepon dari formulir, itu bukan cara Anda mengirim permintaan Ajax (karena memuat halaman)

Ini adalah bagaimana Anda mengirim permintaan ajax dengan csrf:

$.ajax({
      type: "GET",
      url: "/13/devices/",
      beforeSend: function (xhr) {
        xhr.setRequestHeader('X-CSRFToken', '{{csrf_token}}');
      },
      success: function (data) {
        console.log(data);
      }

Nah jika Anda ingin file javascript Anda menerima Django, cukup deklarasikan variabel global dalam javascript (dalam tag script template Anda before Anda mengimpor javascript dengan permintaan ajax):

<script>
   var csrfToken = {{ csrf_token }};
</script>

Dan di javascript Anda cukup gunakan:

beforeSend: function (xhr) {
   xhr.setRequestHeader('X-CSRFToken', csrfToken);
},
1
Linh Nguyen 14 Januari 2020, 09:34