Django:CRUDを実装する【create】DBへのレコード新規登録

Django:CRUDを実装する【create】DBへのレコード新規登録

updateよりも難易度は低いです。

save関数の標準動作がInsertであるため、特に工夫を凝らさなくても新規追加してくれます。

プリセットクラスを利用したレコードの新規追加方法

【CreateView】という汎用ビューが存在しています。
このクラスを利用すると新規追加のViewはたった3行の中身で終わります。

class HogeCreateView(generic.edit.CreateView):
    model = Hoge
    form_class = HogeCreateForm
    success_url = reverse_lazy("Hoge:hoge_list")

Class宣言後の3行はこんな内容です。いやぁ、マジで簡単。

  • 2行目:操作するモデルを指示
  • 3行目:Updateとかと共通で使うFormを指示
  • 4行目:成功した時のJUMP先を指示

PresetClass(汎用ビュー)を利用する場合の問題点

課題となるパーツはUpdateの時と同じです。同じく知見のある方なら難なくクリアできると思います。

  1. update成功時のリダイレクト先(success_url)にページネーションのあるListを設定する
  2. Template.html で呼び出す {{ form }} でレスポンシブデザインを作る
  3. update時のバリデーションエラーが発生する

これらの乗り越え方については前回記事をご参照ください。

関数(def)を使ってCreateを書く

■app/urls.py

from django.urls import path
from . import views

app_name = 'hoge'
urlpatterns = [
  path('<int:page>/', views.HogeListView, name="hoge_list"),
  path('create', views.HogeCreateView, name="hoge_create"),
]

■app/views.py

from django.views import generic
from django.contrib import messages
from django.shortcuts import render,redirec
from .models import hoge 
from django.core.paginator import Paginator

def HogeCreateView(request):
    if (request.method == 'POST'):
        model = Hoge()
        Recode = HogeCreateForm(request.POST, instance=model)
        Recode.save()
        messages.success(request, 'レコードを新規追加しました。')
        return redirect(to='/hoge/1/')

    params = {
        'url': '/hoge/create'
    }
    return render(request, 'hoge_create.html', params)

チョット解説

上に載せた views.pyはFormを活用した例です。ゴリゴリ行く場合は9行目~11行目を変更します。

#データ適用 NULLに文字列Noneが入ることを回避
if ((request.POST['column01'] == 'None')or(request.POST['column01'] == '')):
        column01 = None
else:
        column01 = request.POST['column01']
if ((request.POST['column02'] == 'None')or(request.POST['column02'] == '')):
        column02 = None
else:
        column02 = request.POST['column02']
if ((request.POST['column03'] == 'None')or(request.POST['column03'] == '')):
        column03 = None
else:
        column03 = request.POST['column03']

Recode = Hoge(
        column01=column01,
        column02=column02,
        column03=column03
        )
Recode.save()

関数で書いた時に悩むところ

  • NULLを入れたいのにNoneが登録される(場合によってはこれが原因でバリデーションエラーになる)

これもUpdateの記事で書いた内容と同じなので、前回記事をご参照ください。

まとめ

Updateを構築できればCreateはわけなく処理できます。Deleteも同じです。

Deleteはobject.delete()だけで処理できてしまいます。

def HogeDeleteView(request,pk):
    object = Hoge.objects.get(pk=pk)

    if (request.method == 'POST'):
        object.delete()
        messages.success(request, '削除しました')
        return redirect(to='/hoge')
(以下略)

Update書けるようになると悩みませんね。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください