django-hijack-admin とDjangoのカスタムユーザーを併せて使うとき、Adminサイトへの登録でハマるので書いておきます。
django-hijackとは、Admin画面から別ユーザーのセッションを乗っ取れるライブラリーです。 個別のユーザーで問題が発生しているときに状態を確認したり、ローカルで動作確認するときに複数アカウントを切り替えやすくなったりで便利になります。
django-hijack-adminはdjango-hijackの機能をAdmin画面から使いやすくしてくれるものです。 かなり小さい実装なので、ライブラリー自体は参考実装にして自分で書いてしまっても十分なものです。
カスタムユーザーをAdminに登録するときにハマる
カスタムユーザーモデルを作って拡張したModelAdminを登録しようとするときに、django-hijack-adminをINSTALLED_APPに入れているとハマります。 具体的にはカスタムユーザーモデル用のModelAdminの内容がAdmin画面に反映されなくなります。
from django.contrib import admin from django.contrib.auth.admin import UserAdmin as AuthAdmin from . import models @admin.register(models.User) class UserAdmin(AuthAdmin): # デフォルトのUserAdminに独自の拡張をする fieldsets = AuthAdmin.fieldsets + (("Additional", {"fields": ("icon",)}),)
ここでは fieldsets
に icon
というフィールドを追加していますが、Admin画面に反映されなくなります。
django-hijack-adminは独自のUserAdminを登録する
原因は django-hijack-admin も独自のUserAdminを登録しようとすることです。
django-hijack-adminは「Hijack」するためのボタンを追加するために、 auth.admin.UserAdmin
を拡張したクラスをAdminに登録します。
Userモデルに対応するModelAdminをunregisterして登録するので、カスタムユーザー用に自身のUserAdminを登録しても無駄になります。
if hijack_admin_settings.HIJACK_REGISTER_ADMIN:
UserModel = get_user_model()
admin.site.unregister(UserModel)
admin.site.register(UserModel, HijackUserAdmin)
解決策
以下の用に3つ設定します
- settingsに
HIJACK_REGISTER_ADMIN = False
を設定する - UserAdminで
HijackUserAdminMixin
をMixinする - list_displayに
'hijack_field'
を足す
このようになります。
from hijack_admin.admin import HijackUserAdminMixin @admin.register(models.User) class UserAdmin(AuthAdmin): ... list_display = AuthAdmin.list_display + ('hijack_field',)
カスタムユーザーを使うときの設定方法は READMEに書かれています 。 ですがdjango-hijack-adminがデフォルトで、元の動作を音もなく書き換えるので少し気づきにくいと思います。
もしdjango-hijack-adminを使っていて「おかしいな」というときは疑ってみてください。