[英]Django AJAX requests: create and delete a course. deleting a course not working
在我的應用程序中,我想使用ajax創建和刪除Course實例。 我已經完成創建功能,如下所示:
urls.py
app_name = 'courses'
urlpatterns = [
path('index/', views.index, name='index'),
path('create/', views.create, name='create'),
path('delete/<int:course_id>/', views.delete, name='delete'),
]
views.py
from django.shortcuts import render, redirect
from courses.models import Course
from django.http import JsonResponse
from django.forms.models import model_to_dict
# Create your views here.
def index(request):
context = {
'courses':Course.objects.all(),
}
return render(request, 'courses/index.html', context)
def create(request):
if request.method == 'POST':
course = Course.objects.create(name=request.POST['name'], description=request.POST['description'])
# return redirect('courses:index')
# course is a queryset, we need to change it to a dictionary
return JsonResponse(model_to_dict(course))
else:
return render(request, 'courses/index.html')
def delete(request, course_id):
course = Course.objects.get(pk=course_id)
if request.method == 'POST':
course.delete()
courses = Course.objects.all()
return JsonResponse((courses))
# return JsonResponse(model_to_dict(course))
else:
return render(request, 'courses/index.html', {'courses':Course.objects.all()})
這是它的jQuery:
$(document).ready(function(){
$('.course_form').submit(function(event){
console.log(event);
event.preventDefault();
$.ajax({
url: '/courses/create/',
method: 'post',
data: $(this).serialize(),
success: function(response){
console.log(response);
$('.courses').append(`<p>Name: ${response.name},
Description: ${response.description}</p>
<form class="delete_form" action="/courses/delete/${response.id}/" method="post">
<input type="submit" value="delete">
</form>
`)
$('.course_form')[0].reset();
}
});
})
$('delete_form').submit(function(event){
console.log(event);
event.preventDefault();
$.ajax({
url: '/courses/delete/',
method: 'post',
success: function(response){
console.log(response);
}
})
})
})
創建課程后,我將在課程下方添加一個刪除按鈕。 問題是正在創建的表單沒有csrf令牌,但鑒於csrf令牌是python,我不知道如何使用jquery添加表單。 關於如何解決此問題的任何想法?
基於Django文檔,您有2個關於CSRF保護的選項 :
通過以下方式在Javascript中設置CSRF令牌:
{% csrf_token %} <script type="text/javascript"> // using jQuery var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val(); </script>
從csrftoken
cookie中獲取它,並為所有AJAX請求設置它:
function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.