【django】データベース内のレコードを更新する

 

この記事では、Djangoで作成したレコードを更新するアプリを作ってみます。

 

 

概要

 

今回の記事では、Pythonのdjangoというフレームワークを使ってデータベースを操作するwebアプリを作ります。

 

使っているバージョンは以下の通りです。

  • Python 3.6
  • django 2.1

 

データベースにはCRUDという概念があります。

 

Create(作成)、Read(読み出し)、Update(更新)、Delete(削除)です。

 

ReadはUpdateしたりDeleteする時に使うものなので、ユーザから見るとCreate:作成、Update:更新、Delete:削除の3つの操作となります。

 

Createについては、前回の記事で載せていますので今回はUpdate:更新をしてみましょう。

 

前回の記事:https://ymgsapo.com/create-record/

 

indexページの編集

 

今回の記事で登場するページはレコードを表示するindexページと、レコードを編集するeditページです。

 

まず初めにindexページを編集してeditページへのリンクを作成します。

 

index.html

<body>
    <h1>{{ title }}</h1>
    <table>
        <tr>
            <th>data</th>
        </tr>
        {% for item in data %}
            <tr>
                <td>{{ item }}</td>
                <td><a href="{% url 'edit' item.id %}">Edit</a></td>
            <tr>
        {% endfor %}
    </table>
</body>

 

リンクのURLを{% url ‘edit’ item.id %}と記載することで、Editボタンを押したときに編集するレコードのIDを送ることができます。

 

例えば、レコードのID1を編集する時には、/hello/edit/1のページで編集するようにします。

 

 

edit

 

レコードの隣にEditボタンが表示されました。

 

ボタンが押された時の処理を割り当てをurls.pyに記載します。

 

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('create', views.create, name='create'),
    path('edit/<int:num>', views.edit, name='edit')
]

 

<int:num>を指定することで、レコードのIDをview.pyのedit関数に渡すことができます。

 

ビューの編集

 

views.pyの中にedit関数を作ります。

 

views.py

def edit(request, num):
    obj = Friend.objects.get(id=num)
    if request.method == 'POST':
        friend = FriendForm(request.POST, instance=obj)
        friend.save()
        return redirect(to='/hello')
    params = {
        'title': 'Hello',
        'id': num,
        'form': FriendForm(instance=obj),
    }
    return render(request, 'hello/edit.html', params)

 

index.htmlのeditボタンを押したときには、最初のif文を通らずrender関数でedit.htmlを表示します。

 

その時に、ユーザが選択した’id’とそのレコードの内容(obj)が格納された’form’をedit.htmlに渡したいので、paramsの中に定義しています。

 

editページの作成

 

編集するページを作ります。編集ページには、レコードの内容を表示し、変更した内容を確定する機能を実装します。

 

レコードの内容を表示するには、中身が格納されたformを表示すればよいですね。

 

内容の確定は、ボタンを作って内容をPOSTするようにしましょう。

 

edit.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
    <link rel="stylesheet" type="text/css" href="{% static 'hello/css/style.css' %}">
</head>
<body>
    <h1>{{ title }}</h1>
    <table>
        <form action="{% url 'edit' id %}" method="post">
            {% csrf_token %}
            {{ form.as_table }}
            <tr><td></td><td><input type="submit" value="click"></td></tr>
        </form>
    </table>
</body>
</html>

 

form.as_table でDBから取り出したレコードを格納したフォームを以下のように表示します。

 

 

ここで値を更新してclickボタンを押すと、formタグの中身が実行されます。

 

具体的には、POSTで/hello/edit/2 にアクセスし、ビュー内のedit関数に処理が移ります。

 

views.py

def edit(request, num):
    obj = Friend.objects.get(id=num)
    if request.method == 'POST':
        friend = FriendForm(request.POST, instance=obj)
        friend.save()
        return redirect(to='/hello')
    params = {
        'title': 'Hello',
        'id': num,
        'form': FriendForm(instance=obj),
    }
    return render(request, 'hello/edit.html', params)

 

POSTのデータを受けとったので、if文に入り更新された値をデータベースに書き込みます。

 

その後は、hello/index.htmlのページに移ります。

 

これでデータベースの内容の更新ができました。

 

以上です。皆さんの学習のお役に立てれば嬉しいです。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog