4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

djangoのMixinについて自分なりにまとめる

Last updated at Posted at 2021-11-06

今回のお題

今回はdjangoのMixinという概念についてまとめます。

他の言語ではあまり見ない概念なので、自分の中での理解を深めるとともに自分と同じようにMixinという用語に面食らっている方のお役に立てればと思います。

概要〜Mixinとは

少しカジュアルな言い方になりますが、Mixinとはクラスベースビューに装備させる便利アイテムのようなものです。

クラスベースビューを実装する際にはTemplateViewクラス及びそのサブクラスを何かしら継承させると思いますが、その際にこのMixinも同時に継承させることでビューにさまざまな機能を付与させることができるようになります。

Mixinの実態はAccessMixinというクラスを継承したサブクラスであり、LoginRequiredMixin, UserPassesTestMixin, PermissionRequiredMixinの3つが用意されています。

LoginRequiredMixin

ログインしていないユーザーをログインページにリダイレクトさせるためのMixinです。

login_urlという属性値でリダイレクト先のURLを指定します。

views.py
class UserUpdateView(LoginRequiredMixin, UpdateView):
  template_name = "xxxx"
  login_url = reverse_lazy("account_login")
  # ...以下略...

上記の例では、UserUpdateViewが呼び出される際にログインしていないユーザーはリダイレクトされるようになっています。

また、リダイレクト先はaccount_loginというルーティングnameで指定しています。

UserPassesTestMixin

ある特定の条件をクリアした場合にのみリクエストが成功するようにするためのMixinです(例えば性別が女性の場合にのみそのページにアクセスできるようにするなど)。

このMixinはtest_funcという関数を持っており、この関数の戻り値がTrueであればリクエストは成功、戻り値がFalseであれば403エラーが投げられます。

class IndexView(UserPassesTestMixin, TemplateView):
  def test_func(self):
    return self.request.user.gender == "female"

  raise_exception = False
  login_url = reverse_lazy("account_login")
  # テンプレートビュー本体の定義は省略

raise_exceptionはfunc_testをクリアできなかった場合にエラーを投げるかどうかを決める値で、Falseであればlogin_urlで指定したページに遷移します(初期値はFalseなので省略も可能)。

ただしログイン済みであればraise_exceptionの値に関わらず403エラーになります。

PermissionRequiredMixin

ログイン中のユーザーに特定のPermissionが付与されていない場合に403エラーを投げるためのMixinです。

必要なPermissionはpermission_requiredという属性値を用いてリスト形式で指定します。

item/views.py
class ItemUpdateView(PermissionRequiredMixin, UpdateView):
  permission_required = ["item.change_item"]
  login_url = reverse_lazy("account_login")
  # ...省略...

raise_exceptionlogin_urlを用いた認証失敗時の挙動の制御については、UserPassesTestMixinと同様に可能です。

permission_requiredの指定方法や、ユーザーへのpermissionの付与の方法についてはまた別記事で取り上げます。

終わりに

以上、簡単にですがMixinの解説を終わりたいと思います。

欲を言えばリダイレクト先を自由に指定できるようにしてほしい・・・

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?