0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DjangoでCRUD作成

Posted at

こちらでは、前回作成記事のDjangoまとめの続きとして、
CRUDのアプリを作成です。
既に作成済のメッセージ投稿アプリを例に話していきます。

CRUDとは、create(作成)、read(一覧読みこみ)、update(更新)、delete(削除)
の略称で、アプリ作成の基礎となるものです。
こちらができれば、日記アプリや、ユーザー登録ページなど、様々なものを作ることができます。

前回の記事の手順で、Djangoをインストール、プロジェクト、アプリを作成後に、
まずは、models.pyにデータの持ち方を定義します。

Messageクラスを作成し、
DBで使用する項目をそれぞれ定義しました。
プライマリーキーをいidにし、日付、タイトル、本文、作成日、更新日を追加しました。

class Message(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    date = models.DateField()
    title = models.CharField(max_length=200)
    text = models.CharField(max_length=500)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

次にマイグレーションファイルの作成をします。

python manage.py makemigrations アプリ名

ファイルに定義したテーブルをDBに作成する。マイグレーション

python manage.py migrate

from django.urls import path
from . import views
urls.pyにはルーティングを記載します。

以下のコードの読み方は、
localhost:8000/アプリ名/とURLに打つと、
viewsのmessage_list関数が呼び出されます。

また、localhost:8000/アプリ名/newとURLに打つと、
viewsのmessage_create関数が呼び出されます。

こんな感じで、CRUDのルーティングを記載しました。

urlpatterns = [
    path('', views.message_list, name='message_list'),
    path('new/', views.message_create, name='message_create'),
    path('<uuid:id>/', views.message_detail, name='message_detail'),
    path('<uuid:id>/edit/', views.message_edit, name='message_update'),
    path('<uuid:id>/delete/', views.message_delete, name='message_delete'),
]

さて、CURDのロジック面をviews.pyに記載します。
ルーティングから呼び出している、関数の部分ですね。
こちらの関数では、各HTMLページを呼び出します。

# 一覧ページ
def message_list(request):
    messages = Message.objects.all()
    return render(request, 'message_app/message_list.html', {'messages': messages})


# 詳細表示
def message_detail(request, id):
    message = get_object_or_404(Message, id=id)
    return render(request, 'message_app/message_detail.html', {'message': message})


# 新規作成
def message_create(request):
    if request.method == "POST":
        form = MessageForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('message_list')
        else:
            print(form.errors)
    else:
        form = MessageForm()
    return render(request, 'message_app/message_form.html', {'form': form})


# 編集
def message_edit(request, id):
    message = get_object_or_404(Message, id=id)
    if request.method == "POST":
        form = MessageForm(request.POST, instance=message)
        if form.is_valid():
            form.save()
            return redirect('message_list')
    else:
        form = MessageForm(instance=message)
    return render(request, 'message_app/message_form.html', {'form': form})


# 削除
def message_delete(request, id):
    message = get_object_or_404(Message, id=id)
    if request.method == "POST":
        message.delete()
        return redirect('message_list')
    return render(request, 'message_app/message_confirm_delete.html', {'message': message})

長くなるので、記載はしませんが、
上記でそれぞれ、呼び出しているHTMLページも作成をします。

これでサーバ起動後に、
それぞれのページを確認し、実際に想定通りにページへ反映されるか、確かめます。

一覧ページ

今回は、message_appというアプリ名で作成していますが、 message_app/ と、アプリ名の後に何もつけない、デフォルトだと、一覧ページが出るように作成しています。

一覧次に、詳細ページは、この一番上の[1回目の投稿]をクリックします。
すると、message_app/uuid という、この投稿ページのユニークIDで、
詳細ページが開きます。
詳細

編集をクリックすると、下記のように、message_app/uuid/editで、
編集ページが表示されます。
詳細
もしも、頑張りました。を
頑張りました。本当に
と編集して。保存を押すと、

詳細

再度開いた時に、更新されていることがわかります。

更新後

次に削除ボタンを押すと、アラートが表示されます。
こちらは、message_app/uuid/delete/ でのリクエストとなります。

削除画面

ここで、確認を押すと、削除されたことがわかります。
削除画面

最後に、メッセージの作成をしてみます。
message_app/new/で作成ページに飛びます。

作成画面

作成メッセージを書いた後に、保存ボタンを押します。

作成画面

すると、quitaで投稿というタイトルが一覧ページに増えました。

作成画面

こちらをクリックすると、作成が成功したことがわかります。

作成画面

どんなフレームワークを学ぶときでも、このCRUDの学習は欠かせないものになるので、
ぜひ、参考になればと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?