1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Django]unique制約を持つモデルを更新しようとしたら嵌ったときの手順

Posted at

#はじめに
Djangoでユーザー登録をemailで行いたかったのでカスタムユーザモデルを定義しました。
その後ユーザ情報を変更しデータベースを更新しようとしたらemailが重複して更新できない状態に陥り、手間取ったためここに解決手順を残します。

##状況

app/views.py
from django.shortcuts import redirect,get_object_or_404
 user=get_object_or_404(User,email=request.user.email)
 if request.method=="POST":
   form=UserChangeForm(request.POST)
   if form.is_valid():
       form.save()
       return redirect(hoge)

上記ではエラーが起きます。
解決策は以下になります。詳しくは参考サイトへ。

UserChangeFormクラス生成時に引数としてrequest.POSTだけではなく仮引数instanceにユーザモデルのインスタンスを指定します。

app/views.py
    form=UserChangeForm(request.POST,instance=user)

DjangoではモデルをデータベースへCRUDする関数がsave()しかありません。
故に、既にモデルのインスタンスが存在することをDjangoフレームワークに伝えることでDjango側で新規/更新どちらで行うかを決めてくれるようです。

##個人的メモ
この後、2つ嵌りました。
1、form.is_valid()がTrueにならない
2、FormViewを継承してユーザ情報変更用viewを作った際の上記と同様の処理を行う際の処理

1に関してはUserChangeForm()の引数に問題がありました。
これに関しては別で投稿します。

##参考サイト
https://yuki.world/django-modelform-update-pitfall/

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?