Django 和 AJAX 表单提交 – 更多练习

2023-10-12

这是 Real Python 和 Mr. 的合作作品。内森·尼科尔斯.

于 2014 年 9 月 5 日更新,使应用程序更加 RESTful。


欢迎。上次我们将 AJAX 添加到基本的 Django 通信应用程序中,以改善用户体验。由于我们消除了页面刷新,最终的结果是应用程序对最终用户来说反应更快、功能更强大。

Django AJAX comic

如果您还记得的话,我们在教程结束时布置了一些家庭作业:到你了。我们需要处理更多事件。有了您新发现的 jQuery 和 AJAX 知识,您就可以将它们落实到位。我向最终应用程序添加了代码(您可以在此处下载),其中包含删除链接。您只需要添加一个事件来处理点击,然后调用一个函数,该函数使用 AJAX 向后端发送 POST 请求,以从数据库中删除该帖子。请遵循与我在本教程中相同的工作流程。我们下次会发布这个问题的答案。

所以,在CRUD方面,我们需要添加DELETE能力。我们将使用以下工作流程:

  1. 设置事件处理程序
  2. 创建 AJAX 请求
  3. 更新 Django 视图
  4. 处理回调
  5. 更新 DOM

设置事件处理程序

当用户点击删除链接时,需要在 JavaScript 文件中“处理”这个“事件”:

// Delete post on click
$("#talk").on('click', 'a[id^=delete-post-]', function(){
    var post_primary_key = $(this).attr('id').split('-')[2];
    console.log(post_primary_key) // sanity check
    delete_post(post_primary_key);
});

单击时,我们获取帖子主键,并将其添加到id同时,一个新的帖子被添加到 DOM 中:

$("#talk").prepend("<li><strong>"+json.text+"</strong> - <em> "+json.author+"</em> - <span> "+json.created+
    "</span> - <a id='delete-post-"+json.postpk+"'>delete me</a></li>");

我们还将主键作为参数传递给delete_post()函数,我们需要添加...

创建 AJAX 请求

正如您可能猜到的那样,delete_post()函数处理 AJAX 请求:

function delete_post(post_primary_key){
    if (confirm('are you sure you want to remove this post?')==true){
        $.ajax({
            url : "delete_post/", // the endpoint
            type : "DELETE", // http method
            data : { postpk : post_primary_key }, // data sent with the delete request
            success : function(json) {
                // hide the post
              $('#post-'+post_primary_key).hide(); // hide the post on success
              console.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'>&times;</a></div>"); // add error to the dom
                console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console
            }
        });
    } else {
        return false;
    }
};

将此代码与create_post()功能。有什么不同?

  1. 注意条件。这confirm()方法显示一个对话框,用户必须在其中单击“确定”或“取消”。由于此过程实际上会从数据库中删除帖子,因此我们只想确保用户没有意外单击删除。这只是让他们有机会在发送请求之前取消。

    这些对话框并不是处理此问题的最优雅的方式,但它很实用。测试一下。

  2. 另外,由于我们要删除帖子,因此我们使用“DELETE”作为 HTTP 方法。

请记住,某些较旧的浏览器仅支持 GET 和 POST 请求。如果您知道您的应用程序将在某些旧版本的 Internet Explorer 上使用,您可以使用后隧道作为解决方法。

更新 Django 视图

现在,让我们转向服务器端并更新 Django URL 和视图。请求发送到服务器端,首先由urls.py:

# Talk urls
from django.conf.urls import patterns, url


urlpatterns = patterns(
    'talk.views',
    url(r'^$', 'home'),
    url(r'^create_post/$', 'create_post'),
    url(r'^delete_post/$', 'delete_post'),
)

设置 URL 后,请求将被路由到适当的 Django 视图:

def delete_post(request):
    if request.method == 'DELETE':

        post = Post.objects.get(
            pk=int(QueryDict(request.body).get('postpk')))

        post.delete()

        response_data = {}
        response_data['msg'] = 'Post was deleted.'

        return HttpResponse(
            json.dumps(response_data),
            content_type="application/json"
        )
    else:
        return HttpResponse(
            json.dumps({"nothing to see": "this isn't happening"}),
            content_type="application/json"
        )

如果请求方法是“DELETE”,那么我们从数据库中删除该帖子。如果该主键不存在会发生什么?这将导致意想不到的副作用。换句话说,我们会得到一个未正确处理的错误。看看您是否能找出如何捕获错误,然后使用 try/ except 语句正确处理它。

删除帖子后,我们创建一个响应字典,将其序列化为 JSON,然后将其作为响应发送回客户端。

将代码与create_post()功能。为什么我们做不到request.DELETE.get?嗯,因为 Django 不会像为 GET 和 POST 请求那样为 DELETE(或 PUT)请求构建字典。因此,我们使用get方法从查询字典班级。

笔记:如果我们使用单个视图来处理基于 HTTP 方法(GET、POST、PUT、DELETE)的不同场景,则该应用程序可能会更加 RESTful(并且代码可能会更干燥)。现在,我们对 GET、POST 和 DELETE 方法有不同的看法。这可以很容易地重构为一个视图:

def index(request):
   if request.method == 'GET':
       # do something
   elif request.method == "POST":
       # do something
   elif request.method == "DELETE":
       # do something
   else:
       # do something

下次当我们将 Django Rest Framework 添加到项目中时,我们将深入解决这个问题。

处理回调

回到delete_post()函数于main.js,我们如何处理成功的回调?

success : function(json) {
    // hide the post
  $('#post-'+post_primary_key).hide(); // hide the post on success
  console.log("post deletion successful");
},

在这里,我们隐藏具有特定 id 的标签,然后将成功消息记录到控制台。例如,如果我们删除 id 为20,然后与 id 关联的标签post-20将被隐藏。这管用吗?测试一下。不应该。让我们解决这个问题...

更新 DOM

打开索引.html模板。你在任何地方看到这个id吗?没有。让我们将其添加到开头<li>标签:

<li id='post-{{post.pk}}'>

现在测试一下。它应该有效。

不过,在我们结束之前,我们还需要在其他地方做出改变。如果您添加帖子然后立即尝试删除它会发生什么?它不应该工作,因为我们没有正确更新 DOM。返回到create_post()函数并更新用于向 DOM 添加新帖子的代码:

$("#talk").prepend("<li id='post-"+json.postpk+"'><strong>"+json.text+
    "</strong> - <em> "+json.author+"</em> - <span> "+json.created+
    "</span> - <a id='delete-post-"+json.postpk+"'>delete me</a></li>");

注意到区别了吗?测试一下。一切都很好。

下一步是什么?

Django Rest 框架。

在此之前,如果您有疑问,请发表评论并查看回购协议对于代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 和 AJAX 表单提交 – 更多练习 的相关文章

随机推荐

  • 在您自己的 Python 对象中支持“with”语句

    在本课程中 您将学习如何为您自己的 Python 对象实现上下文管理器功能 在这种情况下 您将使用基于类的方法
  • 第 136 集:使用 pyproject.toml 打包 Python 代码并使用 pathlib 列出文件

    第 136 集 使用 pyproject toml 打包 Python 代码并使用 pathlib 列出文件 真正的 Python 播客 2022 年 12 月 9 日54m RSS Apple Podcasts Google Podcas
  • 了解并安装 Kivy

    要了解有关本课程中的概念的更多信息 请查看 Python 虚拟环境 入门 Kivy项目现场
  • 使用 Python、SQLite 和 SQLAlchemy 进行数据管理

    目录 Using Flat Files for Data Storage 平面文件的优点 平面文件的缺点 平面文件示例 Using SQLite to Persist Data 创建数据库结构 使用 SQL 与数据库交互 Structuri
  • NumPy arange():如何使用 np.arange()

    目录 np arange 的返回值和参数 Range Arguments of np arange 提供所有范围参数 提供两个范围参数 提供一个范围参数 提供否定论据 倒数 获取空数组 np arange 的数据类型 使用 np arang
  • 关于奥斯汀·塞帕利亚

    关于奥斯汀 塞帕利亚 推特 GitHub 领英 个人网站 大家好 我是 Austin Cepalia Real Python 的视频教程作者 我目前是罗切斯特理工学院计算机科学学位的一名学生 但当我能够按照自己的节奏完成项目并挑战我对所学内
  • 第 140 集:使用 Polars 加速数据帧

    第 140 集 使用 Polars 加速数据帧 真正的 Python 播客 2023 年 1 月 13 日57m RSS Apple Podcasts Google Podcasts Spotify More 播客瘾君子 灰蒙蒙 袖珍铸件
  • 2020 年 12 月 2 日

    继续上周会议的内容 在本集中我们将深入探讨使用 PyInstaller 创建可安装应用程序的现场演示
  • 第 72 集:从 FastAPI 开始并检查 Python 的导入系统

    第 72 集 从 FastAPI 开始并检查 Python 的导入系统 真正的 Python 播客 2021 年 8 月 6 日45m RSS Apple Podcasts Google Podcasts Spotify More 播客瘾君
  • 回复消息

    在本课程中 您将学习如何让您的机器人做出响应具体消息在一次聊天中 您将通过处理以下内容来添加机器人以前的功能on message 事件 因为一个Client无法区分机器人用户和普通用户帐户之间的区别 您的on message 处理程序应防止
  • 选择记录类型

    数据记录或普通数据对象用于将相关字段分组到一个位置 Python 提供了多种执行此分组的方法 包括使用dict类型 面向对象的机制 例如类和数据类 以及struct图书馆的Struct二进制记录的对象 以下是有关记录 数据类和结构的资源和附
  • Python 中使用 spaCy 进行自然语言处理

    目录 NLP 和 spaCy 简介 安装spaCy 已处理文本的 Doc 对象 句子检测 spaCy 中的令牌 停用词 词形还原 词频 词性标注 可视化 使用 displaCy 预处理函数 使用 spaCy 基于规则的匹配 使用 spaCy
  • 关于盖尔·阿恩·耶勒

    关于盖尔 阿恩 耶勒 推特 GitHub 经过多年思考这个问题我们在哪里 我现在与数据科学和机器学习在挪威奥斯陆 早些时候 我接触过从 Basic Awk Java 和 C 到 Assembly 的所有语言 现在 我很幸运能够用 Pytho
  • 计算机视觉技术

    人脸检测是一种计算机视觉技术 能够识别数字图像中的人脸 这对人类来说很容易 但计算机需要精确的指令 这些图像可能包含许多非人脸的物体 例如建筑物 汽车 动物等 它与其他涉及人脸的计算机视觉技术 例如面部识别 分析和跟踪 不同 面部识别涉及将
  • 2021 年 6 月 16 日

    主持人大卫 阿莫斯回答会员的问题 在这次会议上 我们讨论了 Python 新闻和更新 为什么不能在续行符后发表评论 如何使用括号隐式连接字符串 一些替代的 Python REPL 是什么 如何开始为开源做出贡献 在哪里可以找到 Python
  • 惯用的熊猫:你可能不知道的技巧和功能

    pandas 是一个用于分析 数据处理和数据科学的基础库 这是一个巨大的项目 具有大量的可选性和深度 在本课程中 您将了解如何使用一些较少使用但惯用的 pandas 功能 使您的代码具有更好的可读性 多功能性和速度 包含内容 11 Less
  • 继承和内部原理:Python 中的面向对象编程

    Python 包含编写面向对象代码的机制 其中 数据和对该数据的操作被结构化在一起 这class关键词这就是在 Python 中创建这些结构的方式 类的定义可以是 基于其他类 允许创建层次结构和 促进代码重用 这种机制称为继承 在本课程中
  • 创建“附近商店”视图

    我们的应用程序后端的几乎所有内容都已完成 在本视频中 我们将重点关注前端 以便为用户提供一种查看其位置附近的商店的方法 在本视频中 我们将要做的是在附近的商店应用程序中创建一个 Django 视图 然后通过主 urls py 将用户路由到该
  • 用于近似重复检测的指纹图像

    目录 我们会做什么 什么是图像指纹 哈希 为什么不能使用md5 sha 1等 图像指纹可以用在哪里 我们需要什么库 第 1 步 对数据集进行指纹识别 第 2 步 搜索数据集 结果 改进我们的算法 概括 这是 Adrian Rosebrock
  • Django 和 AJAX 表单提交 – 更多练习

    目录 设置事件处理程序 创建 AJAX 请求 更新 Django 视图 处理回调 更新 DOM 下一步是什么 这是 Real Python 和 Mr 的合作作品 内森 尼科尔斯 于 2014 年 9 月 5 日更新 使应用程序更加 REST