概要
- プロフィール編集画面のViewを作成する際に、
自分のプロフィールのみアクセス可能とするMixin
とクラスベース汎用ビュー
を継承したクラスを作成する
Mixinとは
- あるクラスと直接は関連しない処理をまとめたもの
- 多重継承で、他のクラスに機能を追加できる
django.contrib.auth.mixins を使う
- ログイン認証関連のMixinが、
django.contrib.auth.mixins
にまとめられている - 今回は、「ログイン済みまたはsuperuser」という条件にしたいため、
UserPassesTestMixin
クラスを利用する- 公式サイトの「Djangoの認証システムを使用する」の「class UserPassesTestMixin」を参照
-
test_func
関数に、成否判定を実装する
実装(各ファイルの変更)
urls.py への追加
path('detail//', UserDetailView.as_view(), name='member_detail'),
path('update//', UserUpdateView.as_view(), name='member_update'),
views.py への追加
- (ユーザ種別ごとに入力項目を変えたいので、Form関連の記述は別途記載予定)
from django.contrib.auth.mixins import UserPassesTestMixin
from django.views.generic import DetailView, UpdateView
class OnlyYouMixin(UserPassesTestMixin):
raise_exception = False # set True if raise 403_Forbidden
def test_func(self):
user = self.request.user
return user.pk == self.kwargs['pk'] or user.is_superuser
class UserDetailView(OnlyYouMixin, DetailView):
model = CustomUser
template_name = 'account/detail.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
pass # 必要に応じて処理を追加
return context
class UserUpdateView(OnlyYouMixin, UpdateView):
model = CustomUser
template_name = 'account/update.html'
def get_success_url(self):
return resolve_url('member_detail', pk=self.kwargs['pk'])
テンプレートの追加
- 上記のviews.pyで指定した位置にテンプレートを配置
- ヘッダー部に、プロフィール表示へのリンクを表示
<li class="nav-item"><a class="nav-link" href="{% url 'member_detail' user.pk %}">Show Profile</a></li>
参考
-
-
6.4 クラスの継承
にMixinについて書かれています
-
参考その2
-
ビューごとに継承させるのではなく、
middleware
を作成して、指定した画面以外はログイン必須にする方法もあります。