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の時と同じです。同じく知見のある方なら難なくクリアできると思います。
- update成功時のリダイレクト先(success_url)にページネーションのあるListを設定する
- Template.html で呼び出す {{ form }} でレスポンシブデザインを作る
- 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書けるようになると悩みませんね。


