「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Python と Django での CRUD 操作 - パート 2

Python と Django での CRUD 操作 - パート 2

2024 年 7 月 29 日に公開
ブラウズ:649

前回の記事では、Django プロジェクトのセットアップの基本を説明し、フロントエンドにリストとして表示する演習モデルを作成しました。この記事では、CRUD オペレーションの実行について詳しく説明します。馴染みのない方のために説明すると、CRUD は作成、読み取り、更新、削除の略で、基本的にデータに対して実行できる 4 つの基本的なアクションです。

アプリ フォルダに 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 の略称であるクロスサイト リクエスト フォージェリ (Cross-Site Request Forgery) である偽造攻撃からフォームの送信を保護するのに役立ちます。ユーザー セッションごとに一意のトークンが生成され、サードパーティのサイトからアクセスできないため、不正な変更が発生するのを防ぎます。

私たちのフォームには 2 つの入力フィールドが含まれています。1 つはタイトル用、もう 1 つは日付用で、演習モデルのスキーマに従います。フォームが送信されると、タイトルと日付の値が POST リクエストを介して / エンドポイントに送信され、app/views.py のインデックス ビューによって処理されます。

モデル

Django では、CRUD 操作に対応する特定のメソッドを追加することで、演習モデル (本質的には 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 class メソッドを作成したときに、request.POST.get('title') を使用したことに気づいたかもしれません。これは POST リクエストでは機能しますが、リクエスト オブジェクトで使用できる PUT メソッドや DELETE メソッドはありません。

しかし、POST リクエストと PUT リクエストはどのように区別すればよいのでしょうか?前に作成したフォームを確認すると、送信ボタンに name 属性が割り当てられていることがわかります。この属性には、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})

ボタン名を確認し、それに応じてリクエストを適切な Exercise メソッドに転送します。

app/models.py の演習モデルに更新クラス メソッドを追加しましょう。

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

データベース内の行を更新するには、演習モデルで利用可能な更新メソッドを使用できます。ただし、更新する前に、正しい演習を更新していることを確認する必要があります。これを行うには、主キー(id)で演習をフィルタリングし、その特定の演習のみを更新します。

演習の削除

同様に、exercise.html テンプレートの各演習の横に削除ボタンを追加します。

...

name 属性の値として delete を設定し、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 ビュー ハンドラーは、クエリ パラメーターや HTTP メソッドのリクエスト本文を解析しないため、PUT リクエストと DELETE リクエストをサポートしません。結果として、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] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3