【Django】Userのログイン時にUserの個別ページへリダイレクトする方法

ログインフォームや新規登録フォームでユーザを作成してログイン認証した後、
固定のページではなく、ユーザ個人個人のページへリダイレクトする方法を紹介します

HttpResponseRedirect
reverse

を利用します

↓の参考URLに書かれていた方法ですが、自動翻訳の難解日本語なので
この記事にてわかりやすくできればと思います

- [【参考】](https://www.webdevqa.jp.net/ja/django/django%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E5%BE%8C%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%97%E3%81%BE%E3%81%99gt-mysitecomusername/972077907/)

## 目次

大まかな流れは以下の通りです

1. ユーザ個別ページ作成
2. settings.py変更
3. url設定
4. view関数作成

ついでにおまけで httpresponse と reverse の基礎を紹介しております

では具体的に作例を見ながらやっていきましょう

## 1. ユーザ個別ページ作成

ユーザの個別ページ用のtemplateを用意します

```html:main/templates/main/home.html
{% extends 'main/base.html' %}
{% block content %}
{% load static %}

<h1>{{ user.username }}の個別ページ</h1>

{% endblock %}
```

## 2. settings.py変更

settings.py で指定している`LOGIN_REDIRECT_URL`を以下の通り設定します

```py
# LogInOut
LOGIN_REDIRECT_URL = 'main:login_redirect'
```

## 3. url設定

login , signup 等で、ログイン認証が完了したときに実行されるview関数のurlを追加

```py:main:urls.py
app_name = 'main'
urlpatterns = [
    path('', views.index, name='index'),
    path('signup/', views.signup, name='signup'),
    path('login/', auth_views.LoginView.as_view(template_name='main/login.html'), name='login'),
    path('login_redirect/', views.login_redirect, name='login_redirect'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('login_redirect/', views.login_redirect, name='login_redirect'), # login_redirect 時に実行されるurl,view関数
    path('home/', views.home, name='home'), # user の 個人ページ
]
```

## 4. view関数作成

view関数を作成します
ここでdjangoに用意されている`HttpResponseRedirect()`,`reverse()`を利用します

- 公式レファレンス
  - [reverse()](https://docs.djangoproject.com/en/4.0/ref/urlresolvers/)
  - [HttpResponseRedirect()](https://docs.djangoproject.com/ja/4.0/ref/request-response/#django.http.HttpResponseRedirect)

- HttpResponseRedirectを使ってリダイレクトを実行するだけの関数を作成
- reverseを使って、request user の 個人ページにリダイレクトするようにする

```py:main/views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse

# index
def index(request):
    return render(request, 'main/index.html')


# ログイン後、ユーザの個別ページへリダイレクト
def login_redirect(request):
    return HttpResponseRedirect(reverse('main:home'))


# ユーザメインページ
@login_required
def home(request):
    return render(request, 'main/home.html')
```

これで、ログイン実行したときにユーザ個人ページが表示されればOK

# おまけ. reverse() と HttpResponseRedirect() の使い方

- reverse()

`reverse(view関数名, args=[])` で使う
reverse を使うと 引数に指定したview関数を実行するurlを出力できる
出力される文字列は→`/path/to/view` のような感じの文字列

```py
>>> from django.urls import reverse
>>> from main.views import home

## user をセット
>>> user = User.objects.get(id=1)
>>> user
<User: user1>

## reverse 実行
>>> reverse('main:home', args=[user.username])
'/home/user1/'
>>> type(reverse('main:home', args=[user.username]))
<class 'str'>
```

- HttpResponseRedirect()

`HttpResponseRedirect('/path')` で使う
引数に指定したパスへリダイレクトしてくれる

## 組み合わせ

上記2つを組み合わせることでreverseで検索したURLパスにリダイレクトしてくれる関数が作成できる

```py
def rediret(request):
    return HttpResponseRedirect(reverse('main:home', args=[request.user.username]))
```

# 追伸

参考ページのwebdevqa.jp.netは一体なんなんだ、、
いつもかゆいところに手が届くQAが載ってる、、
自動翻訳日本語理解するのすごい疲れるが、、、