ログインフォームや新規登録フォームでユーザを作成してログイン認証した後、
固定のページではなく、ユーザ個人個人のページへリダイレクトする方法を紹介します
HttpResponseRedirect
reverse
を利用します
↓の参考URLに書かれていた方法ですが、自動翻訳の難解日本語なので
この記事にてわかりやすくできればと思います
目次
大まかな流れは以下の通りです
- ユーザ個別ページ作成
- settings.py変更
- url設定
- view関数作成
ついでにおまけで httpresponse と reverse の基礎を紹介しております
では具体的に作例を見ながらやっていきましょう
1. ユーザ個別ページ作成
ユーザの個別ページ用のtemplateを用意します
{% extends 'main/base.html' %}
{% block content %}
{% load static %}
<h1>{{ user.username }}の個別ページ</h1>
{% endblock %}
2. settings.py変更
settings.py で指定しているLOGIN_REDIRECT_URL
を以下の通り設定します
# LogInOut
LOGIN_REDIRECT_URL = 'main:login_redirect'
3. url設定
login , signup 等で、ログイン認証が完了したときに実行されるview関数のurlを追加
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()
を利用します
-
公式レファレンス
-
HttpResponseRedirectを使ってリダイレクトを実行するだけの関数を作成
-
reverseを使って、request user の 個人ページにリダイレクトするようにする
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
のような感じの文字列
>>> 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パスにリダイレクトしてくれる関数が作成できる
def rediret(request):
return HttpResponseRedirect(reverse('main:home', args=[request.user.username]))
追伸
参考ページのwebdevqa.jp.netは一体なんなんだ、、
いつもかゆいところに手が届くQAが載ってる、、
自動翻訳日本語理解するのすごい疲れるが、、、