DjangoのListViewで権限に応じてを表示するリストを変える方法
DjangoのListViewでsuperuserはすべてのリストを表示し、一般ユーザは自分のリストのみ表示する方法をご紹介します。
条件
- Django 2.1.3
- Python 3.7.0
ListViewによる一覧表示
ListViewによるデータの一覧表示では主に以下2つの方法が用いられます。
- データすべてを表示:「model =」を指定する。
- MyModel.objects.all()のクエリが発行される。
- データのサブセットを表示:「queryset =」を指定する。
- queryset =で指定したクエリが発行される。
例)「model =」を指定
# views.py抜粋 class IndexView(LoginRequiredMixin, generic.ListView): model = MyModel template_name = 'monitor/index.html'
例)「queryset =」を指定
# views.py抜粋 class IndexView(LoginRequiredMixin, generic.ListView): queryset = MyModel.objects.order_by('-publication_date') template_name = 'monitor/index.html'
動的なフィルタリング
一覧画面において、管理者ユーザ(superuser)はすべての情報を表示し、一般ユーザは自分の情報のみを表示したいケースがあるかと思います。
このようなケースはget_queryset()を用いて実現します。
https://docs.djangoproject.com/ja/2.1/topics/class-based-views/generic-display/#dynamic-filtering
例)get_queryset()
# views.py抜粋 class IndexView(LoginRequiredMixin, generic.ListView): paginate_by = 5 template_name = 'monitor/index.html' def get_queryset(self): current_user = self.request.user if current_user.is_superuser: # スーパーユーザの場合、リストにすべてを表示する。 return MyModel.objects.all() else: # 一般ユーザは自分のレコードのみ表示する。 return MyModel.objects.filter(author=current_user.id)
get_queryset()の中で現在ログイン中のユーザ情報を取得し、スーパーユーザか否かで取得するデータを切り分けています。
以上でユーザ権限に応じた一覧情報表示の切り替えが実現できます。
Django
“DjangoのListViewで権限に応じてを表示するリストを変える方法” に対して1件のコメントがあります。