今回のお題
今回はdjangoのMixinという概念についてまとめます。
他の言語ではあまり見ない概念なので、自分の中での理解を深めるとともに自分と同じようにMixinという用語に面食らっている方のお役に立てればと思います。
概要〜Mixinとは
少しカジュアルな言い方になりますが、Mixinとはクラスベースビューに装備させる便利アイテムのようなものです。
クラスベースビューを実装する際にはTemplateViewクラス及びそのサブクラスを何かしら継承させると思いますが、その際にこのMixinも同時に継承させることでビューにさまざまな機能を付与させることができるようになります。
Mixinの実態はAccessMixinというクラスを継承したサブクラスであり、LoginRequiredMixin, UserPassesTestMixin, PermissionRequiredMixinの3つが用意されています。
LoginRequiredMixin
ログインしていないユーザーをログインページにリダイレクトさせるためのMixinです。
login_urlという属性値でリダイレクト先のURLを指定します。
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という属性値を用いてリスト形式で指定します。
class ItemUpdateView(PermissionRequiredMixin, UpdateView):
permission_required = ["item.change_item"]
login_url = reverse_lazy("account_login")
# ...省略...
raise_exceptionとlogin_urlを用いた認証失敗時の挙動の制御については、UserPassesTestMixinと同様に可能です。
permission_requiredの指定方法や、ユーザーへのpermissionの付与の方法についてはまた別記事で取り上げます。
終わりに
以上、簡単にですがMixinの解説を終わりたいと思います。
欲を言えばリダイレクト先を自由に指定できるようにしてほしい・・・