LoginSignup
6
2

More than 1 year has passed since last update.

カスタムユーザー使っている時のAdminの継承先はUserAdminにするといいよ?

Last updated at Posted at 2021-12-15

django admin 使っていこうぜ!
まいど、東京に来ても関西弁が抜けないstbtkhrです。

今日は小ネタ的な、備忘録的なことを書いていきます。

カスタムユーザーAdminでadmin.ModelAdminを使うのはダメ

みなさんdjnagoでカスタムユーザーって使っていますか?
いろんな記事を見ていると、admin構成時以下のようにしている記事が見受けられました。
ちなみにアプリ名はaccountにしています。

account/admin.py
from django.contrib import admin
from .. import models

@admin.register(models.User)
class UserAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'email',
        'username',
)
# ...etc...

このadmin.ModelAdminを継承すると実はアドミンのuser画面のdjango本来の実力をだせません。
特に顕著な違いは、ここのユーザー画面を出した時です。
admin.ModelAdminを継承した場合のユーザー画面は以下の通り!

ユーザー画面1

現状のままだとpdkdf2.....と続いているのがわかりますね?これはハッシュ暗号化されているということをさします。
パスワードを変更して保存してみてください。
一応仮にtestと書いておこう。そして保存!

ユーザー画面2

・・・あれれ?ハッシュ化されてへんやん・・・。DB上も他のパスワードとみても全然ちがいます。
DB

では、どうすべきか

これはなぜ起こるのかというと、継承先のadmin.ModelAdminのformがデフォルトのformを使っているからです。
admin.ModelAdminだけでは、django上だとユーザー画面もただのDB上の一画面でしかないのです。

ちなみにdjango_adminのpasswordは、charFieldでDBに記録されます。
特にユーザー用にカスタマイズされたfieldsではないので、djangoのDB操作もただの文字として認識するだけです。

では、継承先をUserAdminにしてみてください。正確には、django.contrib.auth.adminの中にあるUserAdminです。

account/admin.py
from django.contrib import admin
# ↓追加
from django.contrib.auth.admin import UserAdmin

from .. import models


@admin.register(models.User)
# ↓変更
class UserAdmin(UserAdmin):
# 省略

そうするとどうでしょう。
ユーザー画面3

パスワード専用の画面になっているでしょう!
パスワードもハッシュ化されて保存できるはずです!

これで、また一つdjangoの知識が深まりました!

また機会あれば更新していきます。

6
2
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
6
2