KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

djangoのviews.pyで、Adminにログインユーザを判定する方法

登録日 :2024/01/21 11:26
カテゴリ :python django

djangoで認証ユーザか否かで戻り値を調整したい。

認証判定する関数

Djangoのviews.pyで、Adminにログインしているユーザーを判定するには、user_passes_testデコレータを使用することができます。このデコレータは、指定したテスト関数がTrueを返す場合にビューを実行します。

以下は、user_passes_testデコレータを使用してAdminにログインしているかどうかを判定する例です:

from django.contrib.auth.decorators import user_passes_test
from django.shortcuts import render

def is_admin(user):
    return user.is_authenticated and user.is_staff

@user_passes_test(is_admin)
def admin_view(request):
    # ここにAdminユーザーのみがアクセスできるビューロジックを追加
    return render(request, 'admin_template.html')

上記の例では、is_admin関数が user.is_authenticated(ユーザーが認証されているか)と user.is_staff(ユーザーがスタッフであるか=Admin権限を持っているか)の両方を満たす場合に True を返します。その後、@user_passes_test(is_admin)デコレータがこの条件を満たす場合にのみ admin_viewビューがアクセスできるようになります。

また、requestユーザの判定をしたいときは、以下のようにできます。
ユーザのステータスによって、querysetの戻り値を変更します。

class PostView(generic.ListView):
    template_name = 'index.html'
    model = Post

    def get_queryset(self):
        queryset = Post.objects.order_by('-created_at')
        keyword = self.request.GET.get('keyword')

        if self.request.user.is_authenticated and self.request.user.is_staff:
            """認証されかつStaff(管理者権限)の時は全て表示"""
            queryset = queryset.filter(
                Q(status__icontains=1) | Q(status__icontains=2)
            )
        else:
            """一般公開のみを表示"""
            queryset = queryset.filter(Q(status__icontains=2))

        if keyword:
            queryset = queryset.filter(
                Q(title__icontains=keyword) | Q(content__icontains=keyword)
            )
        return queryset