如果您还记得的话,我们在教程结束时布置了一些家庭作业:到你了。我们需要处理更多事件。有了您新发现的 jQuery 和 AJAX 知识,您就可以将它们落实到位。我向最终应用程序添加了代码(您可以在此处下载),其中包含删除链接。您只需要添加一个事件来处理点击,然后调用一个函数,该函数使用 AJAX 向后端发送 POST 请求,以从数据库中删除该帖子。请遵循与我在本教程中相同的工作流程。我们下次会发布这个问题的答案。
所以,在CRUD方面,我们需要添加DELETE能力。我们将使用以下工作流程:
设置事件处理程序
创建 AJAX 请求
更新 Django 视图
处理回调
更新 DOM
设置事件处理程序
当用户点击删除链接时,需要在 JavaScript 文件中“处理”这个“事件”:
// Delete post on click$("#talk").on('click','a[id^=delete-post-]',function(){varpost_primary_key=$(this).attr('id').split('-')[2];console.log(post_primary_key)// sanity checkdelete_post(post_primary_key);});
functiondelete_post(post_primary_key){if(confirm('are you sure you want to remove this post?')==true){$.ajax({url:"delete_post/",// the endpointtype:"DELETE",// http methoddata:{postpk:post_primary_key},// data sent with the delete requestsuccess:function(json){// hide the post$('#post-'+post_primary_key).hide();// hide the post on successconsole.log("post deletion successful");},error:function(xhr,errmsg,err){// Show an error$('#results').html("<div class='alert-box alert radius' data-alert>"+"Oops! We have encountered an error. <a href='#' class='close'>×</a></div>");// add error to the domconsole.log(xhr.status+": "+xhr.responseText);// provide a bit more info about the error to the console}});}else{returnfalse;}};
defdelete_post(request):ifrequest.method=='DELETE':post=Post.objects.get(pk=int(QueryDict(request.body).get('postpk')))post.delete()response_data={}response_data['msg']='Post was deleted.'returnHttpResponse(json.dumps(response_data),content_type="application/json")else:returnHttpResponse(json.dumps({"nothing to see":"this isn't happening"}),content_type="application/json")
defindex(request):ifrequest.method=='GET':# do somethingelifrequest.method=="POST":# do somethingelifrequest.method=="DELETE":# do somethingelse:# do something
下次当我们将 Django Rest Framework 添加到项目中时,我们将深入解决这个问题。
处理回调
回到delete_post()函数于main.js,我们如何处理成功的回调?
success:function(json){// hide the post$('#post-'+post_primary_key).hide();// hide the post on successconsole.log("post deletion successful");},
在这里,我们隐藏具有特定 id 的标签,然后将成功消息记录到控制台。例如,如果我们删除 id 为20,然后与 id 关联的标签post-20将被隐藏。这管用吗?测试一下。不应该。让我们解决这个问题...
更新 DOM
打开索引.html模板。你在任何地方看到这个id吗?没有。让我们将其添加到开头<li>标签:
<liid='post-{{post.pk}}'>
现在测试一下。它应该有效。
不过,在我们结束之前,我们还需要在其他地方做出改变。如果您添加帖子然后立即尝试删除它会发生什么?它不应该工作,因为我们没有正确更新 DOM。返回到create_post()函数并更新用于向 DOM 添加新帖子的代码: