」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Python 和 Django 中的 CRUD 操作 - 第 2 部分

Python 和 Django 中的 CRUD 操作 - 第 2 部分

發佈於2024-07-29
瀏覽:476

在上一篇文章中,我们介绍了设置 Django 项目的基础知识并创建了练习模型,我们将其以列表的形式显示在前端。在本文中,我们将深入探讨执行 CRUD 操作。对于那些不熟悉的人来说,CRUD 代表创建、读取、更新和删除 — 本质上是您可以对数据执行的四个基本操作。

现在我们已经在应用文件夹中设置了 API,我们只需扩展索引视图来处理创建、更新和删除请求。

表格

让我们设置一个允许用户创建练习的表单。我们将再次使用 HTML 模板来实现此目的。首先,在 app/templates 文件夹中创建一个名为 add_exercise.html 的新模板。

{% csrf_token %}

接下来,在我们的 index.html 模板中,我们将使用以下方法包含 add_exercise.html 模板:

{% extends "base.html" %} {% block content %}
    

Exercises

{% include 'add_exercise.html' %} ... {% endblock %}

我们在这里利用 include 标签,它可以提高 HTML 模板的可组合性,使我们的代码更易于维护和理解。如果您在浏览器中刷新页面,您应该会看到该表单出现在屏幕上。

Add Exercise

在我们的 HTML 中,我们使用

标记,其方法属性设置为 POST,操作属性指向 /,这与我们用来获取练习列表的端点相同。

在此上下文中,csrf_token 是由随机生成的秘密值表示的安全功能。它有助于保护我们提交的表单免受伪造攻击,这就是 CSRF 的意思——跨站请求伪造。为每个用户会话生成一个唯一的令牌,第三方站点无法访问该令牌,从而防止发生未经授权的更改。

我们的表单包含两个输入字段:一个用于标题,另一个用于日期,遵循我们的练习模型的架构。提交表单后,标题和日期的值将通过 POST 请求发送到 / 端点,然后由 app/views.py 中的索引视图进行处理。

该模型

在 Django 中,我们可以通过添加与 CRUD 操作相对应的特定方法来增强我们的 Exercise 模型(本质上是一个 Python 类)。在 app/models.py 文件中,我们将包含以下内容:

class Exercise(models.Model):
    ...

    def create(request):
        title = request.POST.get('title')
        date = request.POST.get('date')

        exercise = Exercise.objects.create(title=title, date=date)

        return exercise

我们可以从 POST 请求访问标题和日期,如上面的代码所示。然后,我们可以利用Django内置的ORM来创建一个新的练习并返回创建的实例。

我们将利用用于检索练习的相同索引视图,对其进行扩展以检查请求方法是否为 POST。如果是这样,我们将把请求对象传递给我们之前定义的类方法。创建练习后,我们会将用户重定向回主页或执行页面刷新,确保新添加的练习出现在屏幕上。

from django.http import HttpResponseRedirect

from app import models

...

def index(request):
    if request.method == 'POST':
        models.Exercise.create(request)
        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

现在尝试创建一个新练习,您应该会看到它出现在列表底部。

更新练习

在向练习中添加更新功能之前,让我们先重构一下代码。我们将把练习移至他们自己的模板,名为exercise.html。

Exercises

{% include 'add_exercise.html' %}
    {% for exercise in exercises %}
  • {% include 'exercise.html' %}
  • {% endfor %}

在 app/templates 文件夹中为 exercise.html 创建一个模板,我们将向其中添加以下 HTML:

{% csrf_token %}

我们再次对列表中的每个练习使用

标签,并为 exercise.id 添加隐藏输入,该输入将用于更新练习。返回浏览器并刷新页面;您应该会看到列表中每个练习的表格,每个输入都预先填充了相应的练习数据。

CRUD Operations In Python & Django - Part 2

请注意,我们没有使用 PUT 作为表单方法;相反,我们使用 POST。这是因为视图处理程序只能解析通过 GET 和 POST 请求发送的数据,没有对 PUT 和 DELETE 的内置支持。当我们在 Exercise 类中创建 create 类方法时,您可能已经注意到我们使用了 request.POST.get('title')。虽然这适用于 POST 请求,但请求对象中没有可用的 PUT 或 DELETE 方法。

但是我们如何区分 POST 和 PUT 请求呢?如果您检查我们之前创建的表单,您会注意到我们为提交按钮分配了一个名称属性。我们可以像访问标题和日期一样访问此属性,使用 request.POST.get('update').

让我们更新创建练习表单以包含相同的更改。

...

在我们的练习视图中,我们将进行以下更改以区分请求。

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

我们检查按钮名称并相应地将请求转发到适当的练习方法。

让我们向 app/models.py 中的 Exercise 模型添加更新类方法。

def update(request):
    id = request.POST.get('id')
    title = request.POST.get('title')
    date = request.POST.get('date')

    exercise = Exercise.objects.filter(pk=id).update(title=title, date=date)

    return exercise

要更新数据库中的行,我们可以使用 Exercise 模型上提供的更新方法。然而,在更新之前,我们需要确保我们更新的是正确的练习。为此,我们按主键 id 过滤练习,并仅更新该特定练习。

删除练习

同样,我们将在exercise.html模板中的每个练习旁边添加一个删除按钮。

...

我们将把delete设置为name属性的值,并在views.py中,我们将扩展if...elif语句来处理删除操作。

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST
        delete = 'delete' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)
        elif delete == True:
            models.Exercise.delete(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

在练习模型中,我们将添加类方法delete。

def delete(request):
    id = request.POST.get('id')
    is_deleted = Exercise.objects.filter(pk=id).delete()

    if is_deleted == 1:
        return True

    return False

通过此添加,我们已在 Python 和 Django 应用程序中成功实现了 CRUD 操作。

要点

  1. Django 视图处理程序不支持 PUT 和 DELETE 请求,因为它们不解析这些 HTTP 方法的查询参数或请求正文。因此,我们必须依赖 POST 请求,并通过在请求正文中传递附加字段来区分它们。
  2. 注意到我正在向我从中获取练习的同一路线发出 POST 请求。这很重要,因为如果您要创建像 /api/exercises 这样的端点来处理请求,则需要手动管理重定向。否则,请求后
    标记的行为是将用户重定向到action属性中指定的端点。因此,您需要手动将用户重定向回所需页面,或者在我们的示例中,将用户保持在同一页面上。
from django.http import HttpResponseRedirect

def index(request):
    ...

    return redirect('/')
    # or
    return HttpResponseRedirect(request.META['HTTP_REFERER'])

总之,通过有效管理我们的 POST 请求并确保正确的重定向,我们可以在 Django 应用程序中实现 CRUD 操作的同时创建无缝的用户体验。

版本聲明 本文轉載於:https://dev.to/prvnbist/crud-operations-in-python-django-part-2-4fad?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-27
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-11-27
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-27
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-27
  • 如何在Python中執行非阻塞子進程?
    如何在Python中執行非阻塞子進程?
    非阻塞子程序呼叫使用 subprocess.call 執行外部腳本時,維護非阻塞工作流程對於避免主程式停頓至關重要。本文提出了實現此目標的綜合解決方案。 使用 subprocess.Popen 的方法執行非阻塞子程序的主要方法是使用 subprocess.Popen 而不是 subprocess.c...
    程式設計 發佈於2024-11-27
  • 如何將數字單字(例如“一”)轉換為整數值(例如 1)?
    如何將數字單字(例如“一”)轉換為整數值(例如 1)?
    數字字可以轉換為整數值嗎? 許多場景下都需要對數字字進行轉換,如「一」 ,」 轉換為像 1這樣的整數。的解決方案涉及利用字典將數字單字映射到其對應的整數值。 text2int(),首先初始化字典(如果尚未完成)。 。遇到非法單字。累積結果相加即可得到轉換結果。 text2int() 函數的範例:te...
    程式設計 發佈於2024-11-27
  • 在 C++ 中如何使用變數名稱作為字串來存取變數的值?
    在 C++ 中如何使用變數名稱作為字串來存取變數的值?
    從C 表示變數名稱的字串存取變數值在C 中,可以使用變數動態取得變數的值名稱作為字串。這種技術通常稱為反射,允許靈活的調試和自省功能。 要實現這一點,您可以利用以下步驟:來取得變數位址:使用「 &”運算子檢索變數的位址。例如,&counter 傳回儲存 counter 的記憶體位置。 轉換為指標:轉...
    程式設計 發佈於2024-11-27
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內容...
    程式設計 發佈於2024-11-27
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-27
  • 如何使用 ng-options 渲染從 AngularJS 中的陣列填充的選擇元素?
    如何使用 ng-options 渲染從 AngularJS 中的陣列填充的選擇元素?
    使用ng-Options 渲染並從數組中選擇在AngularJS 中,ng-options 提供了一種便捷的方法來創建選擇元素並從數組中填充其選項大批。首先,讓我們考慮一個物件陣列:$scope.items = [{ ID: '000001',
    程式設計 發佈於2024-11-26
  • 為什麼 Docker 在 MacOS 上運行緩慢以及如何提高效能?
    為什麼 Docker 在 MacOS 上運行緩慢以及如何提高效能?
    MacOS 上的Docker 速度變慢:原因和解決方案由於Mac OS 和Linux 核心之間的根本差異,MacOS 上的Docker 帶來了效能挑戰,Docker 需要它才能有效運作。與直接在 Linux 上運行相比,核心和 Docker 容器之間的這個抽象層會影響效能並限制 Docker 在 M...
    程式設計 發佈於2024-11-26
  • 使用 Power BI 線上課程掌握資料視覺化
    使用 Power BI 線上課程掌握資料視覺化
    1. 為什麼 Power BI 在商業智慧中至關重要 Power BI 徹底改變了企業處理資料分析的方式。透過將原始數據轉化為具有視覺吸引力和互動式儀表板,它可以實現更好的決策。它的流行源於其用戶友好的介面、整合功能和可擴展性。從小型企業到大型企業,組織使用 Power BI 來:...
    程式設計 發佈於2024-11-26
  • 康威定律和 Web 開發中的關注點分離
    康威定律和 Web 開發中的關注點分離
    康威定律指出,软件系统往往会反映构建它们的组织的通信结构,它在现代 Web 开发的结构方式中发挥着至关重要的作用。从早期实践到当今更复杂的系统(例如微前端和基于组件的架构)的演变在很大程度上是由这一原则决定的。通过研究历史上 Web 开发中的关注点是如何分离的,我们可以更好地理解当前实践是如何出现的...
    程式設計 發佈於2024-11-26
  • Git Bash 基礎:你的第一步
    Git Bash 基礎:你的第一步
    透過我們適合初學者的指南探索 Git Bash 的基礎知識。輕鬆學習管理文件、儲存庫和追蹤變更的基本命令! Git Bash 是一個功能強大的工具,可讓您管理程式碼並與他人合作。它是 Git 版本控制系統的一部分,可幫助開發人員追蹤程式碼中的變更。無論您是初學者還是想要提陞技能的人,了解 Git ...
    程式設計 發佈於2024-11-26
  • _JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之間有什麼區別?
    _JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和 JAVA_OPTS 之間有什麼區別?
    解密_JAVA_OPTIONS、JAVA_TOOL_OPTIONS 和JAVA_OPTIONS 之間的差異在Java 虛擬機(JVM) 配置領域,三個環境變數有不同的用途:_JAVA_OPTIONS、 JAVA_TOOL_OPTIONS、和JAVA_OPTS。雖然 JAVA_OPTS 位於 JVM ...
    程式設計 發佈於2024-11-26

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3