【问题标题】:Django AJAX requests: create and delete a course. deleting a course not workingDjango AJAX 请求:创建和删除课程。删除课程不起作用
【发布时间】:2018-10-30 08:56:33
【问题描述】:

在我的应用程序中,我想使用 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令牌的情况下创建的,但我不知道如何使用jquery添加一个,因为csrf令牌是python。有关如何解决此问题的任何想法?

【问题讨论】:

  • url: '/courses/delete/', 需要course_id 作为参数,它丢失了

标签: jquery ajax django django-forms django-views


【解决方案1】:

根据 Django 文档,您有 2 个选项关于 CSRF Protection

  1. 通过以下方式在 Javascript 中设置 CSRF 令牌:

    {% csrf_token %}
    <script type="text/javascript">
    // using jQuery
    var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
    </script>
    
  2. 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);
        }
      }
    });
    

【讨论】:

  • 我分别粘贴到我的模板和js文件中,但没有运气
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多