この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: ビュー側のログイン判定
SEOタイトル: Django ビューでログイン判定(is_authenticated / @login_required / LoginRequiredMixin の使い分け)

この記事の要点
  • 関数ビューで簡易判定: if request.user.is_authenticated:(属性アクセス、呼び出しではない)
  • 未ログインなら自動でログイン画面へリダイレクト: @login_required デコレータ
  • クラスベースビューで強制ログイン: LoginRequiredMixin を継承
  • テンプレート側: {% if user.is_authenticated %}
  • リダイレクト先は settings.LOGIN_URL(デフォルト /accounts/login/

関数ビューでの判定

最も基本となる書き方。request.user.is_authenticated属性なのでカッコは不要です(Django 1.10 以降)。

from django.shortcuts import render, redirect

def my_view(request):
    if request.user.is_authenticated:
        # ログイン済みの処理
        return render(request, 'logged_in.html', {'user': request.user})
    else:
        # 未ログイン時の処理
        return redirect('login')

古い書き方との違い

バージョン書き方備考
Django 1.9 以前request.user.is_authenticated()メソッド呼び出し
Django 1.10 以降request.user.is_authenticated属性(プロパティ)

@login_required デコレータ

未ログイン時に自動でログインページへリダイレクトしたい場合はデコレータが便利です。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    # ここに来た時点でログイン済みが保証される
    return render(request, 'dashboard.html')

# ログイン URL を明示
@login_required(login_url='/custom-login/')
def my_view2(request):
    ...

未ログインの場合、settings.LOGIN_URL(デフォルト /accounts/login/)にリダイレクトされ、ログイン成功後は元のページに戻ります。

クラスベースビューでの判定 (LoginRequiredMixin)

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView

class DashboardView(LoginRequiredMixin, TemplateView):
    template_name = 'dashboard.html'
    login_url = '/login/'              # 省略時は settings.LOGIN_URL
    redirect_field_name = 'next'       # 戻り先パラメータ名

注意: 多重継承の順序は LoginRequiredMixin左側に書きます。

テンプレート側での判定

{% if user.is_authenticated %}
  

ようこそ、{{ user.username }} さん

ログアウト {% else %} ログイン {% endif %}

権限付き判定

単なるログイン有無ではなく「特定権限がある人だけ」にする場合。

from django.contrib.auth.decorators import permission_required, user_passes_test
from django.contrib.auth.mixins import PermissionRequiredMixin, UserPassesTestMixin

# 関数ビュー: 特定 permission
@permission_required('myapp.change_article')
def edit(request, id):
    ...

# 関数ビュー: 任意条件
@user_passes_test(lambda u: u.is_staff)
def admin_only(request):
    ...

# クラスビュー
class StaffOnlyView(UserPassesTestMixin, TemplateView):
    def test_func(self):
        return self.request.user.is_staff

API ビュー (Django REST framework)

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class MyApiView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({'user': request.user.username})

判定方法 早見表

シーン使うもの
関数ビューで分岐if request.user.is_authenticated:
関数ビューで強制ログイン@login_required
クラスビューで強制ログインLoginRequiredMixin
テンプレートで表示分岐{% if user.is_authenticated %}
権限/属性で絞る@permission_required / UserPassesTestMixin
DRF APIpermission_classes = [IsAuthenticated]