Django 新規ユーザー登録でUserモデルを参照しているモデルも一緒に保存する方法

新規にユーザー登録する際、新しく作られるユーザーモデルを参照しているモデル(ユーザープロファイルなど)も同時に保存しておきたい場合があるかと思います。ログインしている場合であればUserモデルは簡単に取り出せますが、新規ユーザー登録の場合は少し工夫する必要があります。

以下にクラスベースビューでのそのやり方を書きましたが、このやり方のポイントは先にUserモデルを保存させてから追加で保存するモデルを保存する手順を踏むということです。なお以下の例ではUserモデルはカスタム想定です。

my_app.models

from django.db import models
from .models import User  #カスタムユーザーモデル

class MyUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)  #カスタムユーザーと紐付け
    name = models.CharField(max_length=20)

 
my_app.views

from django.views.generic import CreateView
from accounts.forms import RegisterForm
from django.urls import reverse
from .models import User
from .models import MyUser
from django.http import HttpResponseRedirect

class Register(CreateView):
    template_name = “register.html”

    model = User

    form_class = RegisterForm

    def form_valid(self, form):
        super().form_valid(form)  #先に親クラスのform_validを実行しUserモデルを保存させる
        my_user = MyUser()
        t = self.request.POST[“key”]  #キーとなるデータをrequestから取り出す
        my_user.user = User.objects.get(key=t)  #キーを使ってUserオブジェクトを取り出しセットする
        my_user.save()
        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse(‘register_done’)