DjangoのListViewで権限に応じてを表示するリストを変える方法

DjangoのListViewでsuperuserはすべてのリストを表示し、一般ユーザは自分のリストのみ表示する方法をご紹介します。

条件

  • Django 2.1.3
  • Python 3.7.0

ListViewによる一覧表示

ListViewによるデータの一覧表示では主に以下2つの方法が用いられます。

  1. データすべてを表示:「model =」を指定する。
    • MyModel.objects.all()のクエリが発行される。
  2. データのサブセットを表示:「queryset =」を指定する。
    • queryset =で指定したクエリが発行される。

https://docs.djangoproject.com/ja/2.1/topics/class-based-views/generic-display/#viewing-subsets-of-objects

例)「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件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です