Djangoの詳細画面(DetailView)で自分以外のユーザページにアクセス出来ないようにする方法
Djangoの詳細画面(DetailView)で自分以外のユーザページにアクセス出来ないようにする方法をご紹介します。
条件
- Django 2.1.3
- Python 3.7.0
UserPassesTestMixin
クラスベースviewsには、UserPassesTestMixinというクラスが用意されており、指定した条件を満たさない場合に403エラーとすることが出来ます。
実装例1
以下では、詳細画面(DetailView)において、表示する画面がログインユーザ中のpkと異なる場合403エラーになります。
(ただしsuperuserはOK)
# views.py抜粋
class DetailView(LoginRequiredMixin, UserPassesTestMixin, generic.DetailView):
model = MyModel
template_name = 'monitor/detail.html'
def test_func(self):
# pkが現在ログイン中ユーザと同じ、またはsuperuserならOK。
current_user = self.request.user
return current_user.pk == self.kwargs['pk'] or current_user.is_superuser
実行結果(ログインユーザ中のpkと異なる場合)
実装例2
以下のように独自のテストクラスを複数定義して、任意のviewに渡すことで複数条件のチェックを行うこともできます。
# views.py抜粋
class TestMixin1(UserPassesTestMixin):
def test_func(self):
return self.request.user.email.endswith('@example.com')
class TestMixin2(UserPassesTestMixin):
def test_func(self):
return self.request.user.username.startswith('django')
class MyView(TestMixin1, TestMixin2, View):
...
参考
同様に、関数ベースviewでは「user_passes_test」が用意されています。
https://docs.djangoproject.com/ja/2.1/topics/auth/default/#limiting-access-to-logged-in-users-that-pass-a-test
Django



