#はじめに
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()の引数に問題がありました。
これに関しては別で投稿します。