Django Academy · レッスン

form.save()とcommit=False

データを永続化し、保存前にインスタンスを調整します

レッスン 2/413 ステップ

「form.save()とcommit=False」はCoddyKit上の無料Django Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDjango Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Django Academyコースには全4レッスンが含まれています。

1行で保存する

ModelFormの大きな利点はsave()です。フォームのバリデーションが成功したら、1回呼び出すだけでデータを新しい行としてデータベースに書き込めます。💾

if form.is_valid():
    form.save()

save()はオブジェクトを返す

save()を呼び出すと、保存されたモデルインスタンスが返されます。新しいオブジェクトへリダイレクトしたい場合や、新しいidを読み取りたい場合に利用できます。

post = form.save()
print(post.id)

保存前にバリデーションする

必ずis_valid()で確認してからsave()を呼び出します。無効なフォームを保存するとエラーになるため、毎回先に有効性を確認してください。

if form.is_valid():
    form.save()

既存の行を編集する

instanceを指定してフォームを作成した場合、save()は新しい行を作らず、その行を更新します。同じメソッドでも結果が異なります。

form = PostForm(request.POST, instance=post)
if form.is_valid():
    form.save()

一時停止が必要な場合

モデルには、フォームで入力させないフィールドがあることもよくあります。たとえばauthorです。行をデータベースに保存する前に、自分で設定する必要があります。

commit=Falseを使う

save(commit=False)を呼び出すと、フォームからモデルインスタンスを作成しますが、まだデータベースには書き込みません。インスタンスをメモリ上で保持できます。

post = form.save(commit=False)

フォームで省略したフィールドを設定する

保存前のインスタンスを取得したら、追加のデータを設定できます。ここでは、保存前にログイン中のユーザーをauthorとして設定します。

post = form.save(commit=False)
post.author = request.user

保存を完了する

インスタンスを調整したら、そのインスタンス自身のsave()メソッドを呼び出して保存します。これでフォームのデータと追加したフィールドが一緒に保存されます。

post.author = request.user
post.save()

完全なパターン

この3段階のcommit=Falseパターンは、フォームの入力とサーバー側で設定する値を、簡潔かつ安全に組み合わせる一般的な方法です。

post = form.save(commit=False)
post.author = request.user
post.save()

多対多の場合の注意点

注意点が1つあります。commit=Falseを使うと、多対多の関連はまだ保存されません。インスタンスを保存した後にsave_m2m()を呼び出して関連付けてください。

post.save()
form.save_m2m()

成功後にリダイレクトする

行を保存したら、ユーザーを次へ進めます。POSTが成功した後にredirectすると、誤った二重送信を防げます。

post.save()
return redirect("post_detail", pk=post.pk)

簡単な確認

save(commit=False)を使うと、何ができるようになりますか?

まとめ:フォームの保存

順調です!is_valid()の後にsave()を呼ぶと行が保存されます。commit=Falseで追加のフィールドを先に設定し、その後インスタンスを保存します。必要ならsave_m2m()も呼び出します。✅

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「form.save()とcommit=False」レッスンは無料ですか?

はい。「form.save()とcommit=False」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Django Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Django Academyコースには全4レッスンが含まれています。

「form.save()とcommit=False」で何を学びますか?

データを永続化し、保存前にインスタンスを調整します ブラウザで直接実行するハンズオンコードでDjango Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Django Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDjango Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「form.save()とcommit=False」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDjango Academyレッスンでコードを書いて実行できますか?

はい。すべてのDjango Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ModelFormとMeta.fieldsの宣言
  2. form.save()とcommit=False
  3. cleanメソッドによるカスタムバリデーション
  4. Widgets、Labels、Help Text
← Django Academyに戻る