はじめに
今回はDjangoを使って友達リスト的なアプリを作成しようと思います。
プロジェクト名はTomodachi
ユーザー作成時にデフォルトカテゴリを作成する(エラー解決のため)
# ブランチを切り替える
$ git branch feature-user-add-category
$ git checkout feature-user-add-category
ユーザー作成時にデフォルトカテゴリを作成(エラー解決のため)
friendslist/models.py
# ユーザー作成時にデフォルトカテゴリを作成する
@receiver(post_save, sender=User)
def create_category(sender, **kwargs):
if kwargs['created']:
default_category = Category.objects.create(user=kwargs['instance'])
default_category.name = "デフォルト"
default_category.save()
友達一覧を自分が作成した友達のみにする(ユーザーと友達にもリレーションを貼る)
friendslist/models.py
# ユーザーと友達のリレーション
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
friendslist/views.py
# 友達一覧と作成をユーザーに紐付ける
def index(request):
user = request.user
categories = Category.objects.filter(user=user)
first_category = categories.first()
friends = Friend.objects.filter(user=user) ←☆追加する
context = {
'friends': friends,
'categories': categories,
'first_category': first_category,
}
return render(request, 'friendslist/index.html', context)
def create(request):
if request.method == 'POST':
form = FriendForm(request.POST)
if form.is_valid():
friend = form.save(commit=False)
friend.user = request.user ←☆追加する
friend.save()
return redirect('/')
user = request.user
categories = Category.objects.filter(user=user)
first_category = categories.first()
context = {
'categories': categories,
'first_category': first_category,
}
return render(request, 'friendslist/create.html', context)
まだ新規登録直後のエラーが解消されないので、仕様変更
friendslist/views.py
# 新規登録したら直接ログインではなく、ログイン画面からログインしてもらう(応急処置)
def signup(request):
context = {}
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
# user.is_active = False
user.save()
messages.success(request, '登録完了!!!')
return redirect('/login/') ←☆('/')から変更
おそらく問題は、ユーザー作成直後カテゴリ作成のタイミングが遅いのかな?
そこをどうするかが問題。
もう一個エラーがあった
friendslist/views.py
# 誕生日がなければそのままNoneにする
if friend.birthday is not None:
friend_birthday = "{0:%Y-%m-%d}".format(friend.birthday)
else:
friend_birthday = friend.birthday
さいごに
今回は新規登録後にデフォルトカテゴリ作成の処理をしましたが
もともとのエラーが解決できませんでした。
そのため応急処置として
新規登録後は一度ログインすることにしました。