RESTful web Service:Django DELETE 请求

之前读了一些关于REST 风格的文章,觉得蛮好就打算在本次毕设中用用,Django 也支持不同请求方式接口,之前用get()、post()都用得好好的,结果本次就踩坑了,记录一下爬出来的过程。

需求

前端点击按钮,将页面中选中的CheckBox 数据通过 HTTPdelete 传回后端。后端取出数据,删除数据库对应的条目后返回原页面。

实现

1
2
<!--前端按钮代码-->
<button class='btn-large' style="background-color: rgb(236, 152, 118);" onclick="del_med()">删除</button>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//js代码
function del_med() {
var check_num = $("input[name='del_med']:checked").length;
if (check_num == 0) {
alert("请至少选择一项");
return false
}
if (confirm("确认删除所选项目?")) {
var check_list = new Array();
$("input[name='del_med']:checked").each(function () {
check_list.push($(this).val());
});

}
  $.ajax({
        type:"DELETE",
        url:'medicine',
        data:{"delitems":check_list.toString()},
        datatype:"html",
headers:{"X-CSRFtoken": $.cookie('csrftoken')},
success:function(data){
             location.reload();//页面刷新
         },
        error:function(data){
             alert('删除失败!');
         }
     });

}

因为 html 布局不好看所以没有选择form提交CheckBox,而是用js实现的。我基本上不会前端的内容,代码能用,但是说的不一定对。

js

  • 在js中新建数组对象,将所有CheckBox选中的value字段值加入数组;
  • ajax创建Request,把数组放进Request的data中,ajax会自动向后端发送
  • 踩坑点:Django 有一个防止csrf攻击的中间件,它会检查请求是否携带CSRFtoken,所以在请求头必须携带”X-CSRFtoken”,值可以通过$.cookie收到;
  • 踩坑点:如果要用$.cookie,得从jQuery下载'jquery.cookie.js'然后在html中引用,一定要先引用jQuery再引用它

后端

  • 传回后端,HTTPdelete会被类视图的 delete(self,request) 捕捉。不过 DELETE 不像POST 请求一样会自己产生request.POST 这样好用的对象,所以需要先from django.http import QueryDict ,然后在delete(self,request) 中通过DELETE=QueryDict(request.body) 创建对象,再DELETE.get('xxxdata')
  • 从数据库中删除对象,render(原来的网页)。不可以redirect(原来的网页)不然会不停循环循环循环,然后报错。