今回のお題
今回は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の解説を終わりたいと思います。
欲を言えばリダイレクト先を自由に指定できるようにしてほしい・・・